我试图简单地按元素划分两列,但由于某种原因,这将返回两列,而不是我期望的一列。
我认为这与我需要迭代地创建数据框的事实有关,所以我选择了一次追加一行。下面是一些测试代码:
import pandas as pd
df = pd.DataFrame(columns=['image_name partition zeros ones total'.split()])
# Create a DataFrame
data = {
'dataset': ['177.png', '276.png', '208.png', '282.png'],
'partition': ['green', 'green', 'green', 'green'],
'zeros': [1896715, 1914720, 1913894, 1910815],
'ones': [23285, 5280, 6106, 9185],
'total': [1920000, 1920000, 1920000, 1920000]
}
for i in range(len(data['ones'])):
row = []
for k in data.keys():
row.append(data[k][i])
df = df.append(pd.Series(row, index=df.columns), ignore_index=True)
df_check = pd.DataFrame(data)
df_check["result"] = df_check["zeros"] / df_check["total"]
df["result"] = df["zeros"] / df["total"]
df
如果你试着运行这个,你会看到所有的df_check
都像预期的那样工作,当它到达df["result"] = df["zeros"] / df["total"]
时代码失败:
ValueError: Cannot set a DataFrame with multiple columns to the single column result
事实上,如果我尝试检查除法的结果,我注意到有两列包含所有缺失值:
>>> df["zeros"] / df["total"]
total zeros
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
有什么建议为什么会发生这种情况,以及如何解决它?
3条答案
按热度按时间kknvjkwl1#
你设置数据框的逻辑是不正确的,不要使用循环,直接去
DataFrame
构造函数,可选的额外步骤rename
列:输出:
使用您当前的方法,您最终会得到一个具有单个级别的MultiIndex,这会导致进一步的问题(切片
df['zeros']
和df["total"]
会给您两个DataFrames,而不是Series,并且分区未对齐)。在任何情况下,
append
现在都不推荐使用。owfi6suc2#
问题出在下面这行
split()
方法本身创建一个列表,因此避免使用该列表并使用以下命令qni6mghb3#
我实际上解决了这个问题,感谢@mozway回答中的建议。
事实上,问题在于有bug的版本有一个MultiIndex。然而,这是由于我如何指定列列表,而不是由于append方法本身。它解决了从
到
或者甚至只是
columns='image_name partition zeros ones total'.split()
。