【问题标题】:Adding values to a columns based on other columns in the same dataframe根据同一数据框中的其他列向列添加值
【发布时间】:2022-08-13 13:57:04
【问题描述】:

我的目标是根据 A 到 C 列将值放入 D 列。如果值大于 20,我想遍历 A、B 和 C 列中的每一列,并在 D 列中加 1。

import pandas as pd
data={\'A\':[5,2,25,4],\"B\":[15,22,100,24], \"C\":[4, 100, 0, 19], \"D\" : [0,0,0,0]}
df= pd.DataFrame(data)

for x in range(0, len(df.columns)):
    if df.iloc[:, x]  > 20:
        df[\"D\"] = df[\"D\"] +1
    else:
        df[\"D\"] = df[\"D\"]
df

因此,根据示例代码,D 列应如下所示:

D
0
2
2
1

但是,我不断收到此错误-ValueError:系列的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。 我在这里查看了其他答案 (Truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()),这表明这是一个多运算符问题,但我没有在这里使用这些。

我究竟做错了什么?

    标签: python pandas dataframe


    【解决方案1】:

    问题是您不能以矢量方式使用if Series > value。 if 需要一个布尔值,df.iloc[:, x] > 20 返回一系列布尔值。

    在您的情况下使用:

    df['D'] = df.drop(columns='D').gt(20).sum(1)
    

    注意。如果 D 列最初为 null 或不存在,请跳过 .drop(columns='D')。

    输出:

        A    B    C  D
    0   5   15    4  0
    1   2   22  100  2
    2  25  100    0  2
    3   4   24   19  1
    

    【讨论】:

    • 谢谢。如果我们需要根据特定的字符串值而不是数字求和,是否有替代“gt”的方法?
    • == 可以使用eq(也可以使用==)
    • 恭喜,莫兹韦爵士获得 10 万声望 :)
    • 谢谢@Sunderam 快乐编码! :)
    【解决方案2】:

    另一种可能的解决方案:

    df.D = (
      df.loc[:, ~ df.columns.str.contains('D')]
      .apply(lambda x: sum(x > 20), axis = 1))
    

    输出:

        A    B    C  D
    0   5   15    4  0
    1   2   22  100  2
    2  25  100    0  2
    3   4   24   19  1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-21
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多