pandas columns division返回多个列

ilmyapht  于 2023-06-20  发布在  其他
关注(0)|答案(3)|浏览(92)

我试图简单地按元素划分两列,但由于某种原因,这将返回两列,而不是我期望的一列。
我认为这与我需要迭代地创建数据框的事实有关,所以我选择了一次追加一行。下面是一些测试代码:

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

有什么建议为什么会发生这种情况,以及如何解决它?

kknvjkwl

kknvjkwl1#

你设置数据框的逻辑是不正确的,不要使用循环,直接去DataFrame构造函数,可选的额外步骤rename列:

df = pd.DataFrame(data).rename(columns={'dataset': 'image_name'})
df["result"] = df["zeros"] / df["total"]

输出:

image_name partition    zeros   ones    total    result
0    177.png     green  1896715  23285  1920000  0.987872
1    276.png     green  1914720   5280  1920000  0.997250
2    208.png     green  1913894   6106  1920000  0.996820
3    282.png     green  1910815   9185  1920000  0.995216

使用您当前的方法,您最终会得到一个具有单个级别的MultiIndex,这会导致进一步的问题(切片df['zeros']df["total"]会给您两个DataFrames,而不是Series,并且分区未对齐)。

print(df.columns)

MultiIndex([('image_name',),
            ( 'partition',),
            (     'zeros',),
            (      'ones',),
            (     'total',)],
           )

在任何情况下,append现在都不推荐使用。

owfi6suc

owfi6suc2#

问题出在下面这行

df = pd.DataFrame(columns=['image_name partition zeros ones total'.split()])

split()方法本身创建一个列表,因此避免使用该列表并使用以下命令

df = pd.DataFrame(columns='image_name partition zeros ones total'.split())
qni6mghb

qni6mghb3#

我实际上解决了这个问题,感谢@mozway回答中的建议。
事实上,问题在于有bug的版本有一个MultiIndex。然而,这是由于我如何指定列列表,而不是由于append方法本身。它解决了从

df = pd.DataFrame(columns=['image_name partition zeros ones total'.split()])

df = pd.DataFrame(columns=["image_name", "partition", "zeros", "ones", "total"])

或者甚至只是columns='image_name partition zeros ones total'.split()

相关问题