使用列名列表在 pandas 数据帧中执行操作

Using a list of column names to do operations in pandas dataframe

提问人:user115625 提问时间:10/28/2023 最后编辑:user115625 更新时间:10/31/2023 访问量:52

问:

假设我有一个数据帧:

import pandas as pd
df = pd.DataFrame({"A1": [10, 20, 15, 30, 45],
                    "B1": [13, 23, 18, 33, 48],
                    "C1": [17, 27, 22, 37, 52],
                    "A2": [10, 20, 15, 30, 45],
                    "B2": [13, 23, 18, 33, 48],
                    "C2": [17, 27, 22, 37, 52]})
col1_names = ['A1', 'B1', 'C1']
col2_names = ['A2', 'B2', 'C2']
col_new = ['delA', 'delB', 'delC']

我想做一个操作,在 df 中获得三个新列,其值对应于 col2_names 和 col1_names 之间的差值。

for i in range(len(col1_names)):
    df[col_new[i]] = df[col2_names[i]] - df[col1_names[i]]

有没有办法矢量化并在没有循环的情况下进行?

试过这个:

df[col_new] = df[col2_names] - df[col1_names]

预期结果与上述循环解决方案相同,但我得到.ValueError: Columns must be same length as key

附加:这可以推广到其他操作吗?

Python Pandas 数据帧 矢量化

评论

1赞 r-beginners 10/28/2023
我敢肯定还有其他更多的pythonic响应,但以下内容将满足您的要求。pd.DataFrame(df[col2_names].values- df[col1_names].values, columns=col_new)

答:

1赞 Code Different 10/28/2023 #1

当您对数据框执行操作时,它们将对齐其索引。行标签与行标签匹配,与列标签匹配。 并且没有任何共同点,所以你得到了所有的 NA。col1_namescol2_names

试试这个:

df[col_new] = df[col2_names].values - df[col1_names].values

评论

0赞 user115625 10/31/2023
谢谢,这解决了我的问题!当你说“col1_names 和 col2_names 没有任何共同点,所以你得到的都是 NA”时,列名之间有什么共同点会是什么样子?
1赞 Code Different 10/31/2023
公共列将按预期显示数值
0赞 Panda Kim 10/28/2023 #2

法典

col1 = df.filter(like='1').columns
col2 = df.filter(like='2').columns
out = df.join(df[col1].rename(lambda x: 'del' + x[:-1], axis=1)\
                      .sub(df[col2].rename(lambda x: 'del' + x[:-1], axis=1)))

外:

    A1  B1  C1  A2  B2  C2  delA    delB    delC
0   10  13  17  10  13  17  0       0       0
1   20  23  27  20  23  27  0       0       0
2   15  18  22  15  18  22  0       0       0
3   30  33  37  30  33  37  0       0       0
4   45  48  52  45  48  52  0       0       0