【问题标题】:How do I efficiently perform the same function across multiple groups of columns in a pandas dataframe?如何在 pandas 数据框中跨多组列有效地执行相同的功能?
【发布时间】:2023-02-25 05:25:35
【问题描述】:

我正在清理一个用于数据分析的 csv,我是 python 的新手,所以我尽我最大的努力让它尽可能简单,以防有人想稍后再回到这里。

我想对四列执行一个简单的操作并添加一个包含结果的新列,然后对其他 10 组列有效地重复该操作。

我的数据框如下所示:

df = pd.DataFrame({'A1' : [10, 20, 30, 10], 
'A2' : [10,20,30,40],
'A3' : [30, 0, 40, 10],
'A4' : [75, 0, 0, 25],
'B1' : [10, 20, 30, 40],
'B2' : [30, 0, 20, 40],
'B3' : [10, 10, 20, 30],
'B4' : [40, 30, 20, 10]})

#     A1   A2   A3   A4   B1   B2   B3   B4  
#     10   10   30   75   10   30   10   40
#     20   20    0    0   20    0   10   30
#     30   30   40    0   30   20   20   20
#     10   40   10   25   40   40   30   10

我想创建一个值为 (A1+A2+A3)-A4 的新列 (A_dif)。我能够做到这一点如下:

df['A_dif'] = df.loc[:, A1:A3].sum(numeric_only=True, axis=1) - df.loc[:,'A4']

但是,我需要为 B 列(以及大约 10 个类似的列组)执行此操作。我可以手动执行此操作,但我想要一个高效的函数来完成此操作。我试图创建以下函数(然后用它做一个循环)但无法让它工作:

def difference(df, a: str, b: str, c: str) :
     df.loc[:, a:b].sum(numeric_only=True, axis=1) - df.loc[:,c]

test = difference(df, 'A1', 'A3', 'A4')
print(test)
# returns None

感谢您提供的任何帮助!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以按后缀(此处为列名的第一个字母)对列进行分组并计算函数:

    def difference(df):
       return df.iloc[:, :3].sum(numeric_only=True, axis=1) - (df.iloc[:, 3])
    
    df1 = df.groupby(df.columns.str[0], axis=1).apply(difference).add_suffix('_diff')
    out = pd.concat([df, df1], axis=1)
    print(out)
    
    # Output
       A1  A2  A3  A4  B1  B2  B3  B4  A_diff  B_diff
    0  10  10  30  75  10  30  10  40     -25      10
    1  20  20   0   0  20   0  10  30      40       0
    2  30  30  40   0  30  20  20  20     100      50
    3  10  40  10  25  40  40  30  10      35     100
    

    您还可以按位置对列进行分组。如果每次都需要遍历 4 列:

    df1 = (df.groupby(np.arange(len(df.columns)) // 4, axis=1)
             .apply(difference).add_suffix('_diff'))
    

    【讨论】:

      猜你喜欢
      • 2019-05-08
      • 2022-01-12
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-18
      • 1970-01-01
      相关资源
      最近更新 更多