这是我很困惑的事情......
import pandas as pd
# this works fine
df1 = pd.DataFrame(columns=['A','B'])
# but let's say I have this
df2 = pd.DataFrame([])
# this doesn't work!
df2.columns = ['A','B']
# ValueError: Length mismatch: Expected axis has 0 elements, new values have 2 elements
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?我可以做什么?做这样的事情的唯一方法是什么?
if len(df2.index) == 0:
df2 = pd.DataFrame(columns=['A','B'])
else:
df2.columns = ['A','B']
Run Code Online (Sandbox Code Playgroud)
必须有更优雅的方式。
感谢您的帮助!
有人问为什么要这样做:
df2 = pd.DataFrame([])
Run Code Online (Sandbox Code Playgroud)
原因是实际上我正在做这样的事情:
df2 = pd.DataFrame(data)
Run Code Online (Sandbox Code Playgroud)
...其中数据可能是空的列表列表,但在大多数情况下不是。所以是的,我可以这样做:
if len(data) > 0:
df2 = pd.DataFrame(data, columns=['A','B'])
else:
df2 = pd.DataFrame(columns=['A','B'])
Run Code Online (Sandbox Code Playgroud)
...但这似乎不是很 DRY(当然也不简洁)。
如果您有任何问题,请告诉我。谢谢!
小智 3
这看起来像是熊猫中的一个错误。所有这些工作:
pd.DataFrame(columns=['A', 'B'])
pd.DataFrame({}, columns=['A', 'B'])
pd.DataFrame(None, columns=['A', 'B'])
Run Code Online (Sandbox Code Playgroud)
但不是这个:
pd.DataFrame([], columns=['A', 'B'])
Run Code Online (Sandbox Code Playgroud)
在修复之前,我建议如下:
if len(data) == 0: data = None
df2 = pd.DataFrame(data, columns=['A','B'])
Run Code Online (Sandbox Code Playgroud)
或者:
df2 = pd.DataFrame(data if len(data) > 0 else None, columns=['A', 'B'])
Run Code Online (Sandbox Code Playgroud)