提问人:user115625 提问时间:10/28/2023 最后编辑:user115625 更新时间:10/31/2023 访问量:52
使用列名列表在 pandas 数据帧中执行操作
Using a list of column names to do operations in pandas dataframe
问:
假设我有一个数据帧:
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
附加:这可以推广到其他操作吗?
答:
1赞
Code Different
10/28/2023
#1
当您对数据框执行操作时,它们将对齐其索引。行标签与行标签匹配,与列标签匹配。 并且没有任何共同点,所以你得到了所有的 NA。col1_names
col2_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
下一个:JAX 中的矢量化最小化和寻根
评论
pd.DataFrame(df[col2_names].values- df[col1_names].values, columns=col_new)