多个pandas列

时间:2018-01-19 20:10:37

标签: python pandas

如果一个pandas数据框有4列,如下所示:

      A     B     C     D     

0     2     4     1     9     
1     3     2     9     7      
2     1     6     9     2     
3     8     6     5     4       

是否可以以某种方式应用df.cumsum()将结果放在现有列旁边的新列中,如下所示:

      A     AA    B     BB     C     CC     D     DD

0     2     2     4     4      1     1      9     9
1     3     5     2     6      9     10     7     16 
2     1     6     6     12     9     19     2     18
3     8     14    6     18     5     24     4     22  

2 个答案:

答案 0 :(得分:5)

您可以使用assign创建新列:

result = df.assign(**{col*2:df[col].cumsum() for col in df})

并使用sort_index

对列进行排序
result.sort_index(axis=1)
#    A  AA  B  BB  C  CC  D  DD
# 0  2   2  4   4  1   1  9   9
# 1  3   5  2   6  9  10  7  16
# 2  1   6  6  12  9  19  2  18
# 3  8  14  6  18  5  24  4  22

请注意,根据列名称,排序可能无法生成所需的顺序。在这种情况下,使用reindex是确保获得所需列顺序的更可靠的方法:

result = df.assign(**{col*2:df[col].cumsum() for col in df})
result = result.reindex(columns=[item for col in df for item in (col, col*2)])

这是一个展示差异的例子:

import pandas as pd
df = pd.DataFrame({'A': [2, 3, 1, 8], 'A A': [4, 2, 6, 6], 'C': [1, 9, 9, 5], 'D': [9, 7, 2, 4]})

result = df.assign(**{col*2:df[col].cumsum() for col in df})
print(result.sort_index(axis=1))
#    A  A A  A AA A  AA  C  CC  D  DD
# 0  2    4       4   2  1   1  9   9
# 1  3    2       6   5  9  10  7  16
# 2  1    6      12   6  9  19  2  18
# 3  8    6      18  14  5  24  4  22

result = result.reindex(columns=[item for col in df for item in (col, col*2)])
print(result)
#    A  AA  A A  A AA A  C  CC  D  DD
# 0  2   2    4       4  1   1  9   9
# 1  3   5    2       6  9  10  7  16
# 2  1   6    6      12  9  19  2  18
# 3  8  14    6      18  5  24  4  22

答案 1 :(得分:1)

@ unutbu的方式肯定有效,但使用insert对我来说更好。另外,您无需担心排序/重新索引!

for i, col_name in enumerate(df):
    df.insert(i * 2 + 1, col_name * 2, df[col_name].cumsum())

df

返回

   A  AA  B  BB  C  CC  D  DD
0  2   2  4   4  1   1  9   9
1  3   5  2   6  9  10  7  16
2  1   6  6  12  9  19  2  18
3  8  14  6  18  5  24  4  22