为空的熊猫数据框设置列

JPN*_*JPN 5 python pandas

这是我很困惑的事情......

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)

必须有更优雅的方式。

感谢您的帮助!

2015 年 4 月 19 日更新

有人问为什么要这样做:

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)