在Pandas中动态添加列(python中的方法链接)

qacovj5a  于 2023-01-15  发布在  Python
关注(0)|答案(3)|浏览(154)

我想创建一个名为total的新列,它将所有的year列相加(这些列中的所有内容都是整数),我想动态地做这件事,因为每年都会有一个新列(例如2024)。
在Python中,如何使用方法链和赋值运算符来实现这一点?

id name     2018 2019 2020 2021 2022  type
1  John      0    1    0    0    2    A
2  Bill      1    5    4    0    0    B
3  Tom       0    0    2    0    5    B
4  Mary      0    1    1    0    0    A
    • 预期产出:**
id name     2018 2019 2020 2021 2022 type total
1  John      0    1    0    0    2    A   3
2  Bill      1    5    4    0    0    B   10
3  Tom       0    0    2    0    5    B   7
4  Mary      0    1    1    0    0    A   2

我有这个解决方案,但我不喜欢它,有没有更好的方式来编写这个代码?

    • 临时解决方案:**
(
     df
     .assign(Total = lambda x: x['2018'] + x['2019'] + x['2020'] + x['2021'] x['2022'])
)
bkhjykvo

bkhjykvo1#

假设只有year列具有int值,则只需执行df['Total'] = df.sum(axis = 1)

columns = ['name', '2018', '2019', '2020', '2021', '2022', 'type']
values = [['John',0,1,0,0,2,'A'], ['Bill',1,5,4,0,0,'B'], ['Tom',0,0,2,0,5,'B'], ['Mary',0,1,1,0,0,'A']]

df = pd.DataFrame(values, columns = columns)

df['Total'] = df.sum(axis = 1)
df

输出:

name       2018    2019    2020   2021    2022    type    Total
0   John    0       1       0      0       2       A        3
1   Bill    1       5       4      0       0       B        10
2   Tom     0       0       2      0       5       B        7
3   Mary    0       1       1      0       0       A        2
zz2j4svz

zz2j4svz2#

使用DataFrame.loc选择20182022之间的列:

df = df.assign(Total = df.loc[:, '2018':'2022'].sum(axis=1))
print (df)
   id  name  2018  2019  2020  2021  2022 type  Total
0   1  John     0     1     0     0     2    A      3
1   2  Bill     1     5     4     0     0    B     10
2   3   Tom     0     0     2     0     5    B      7
3   4  Mary     0     1     1     0     0    A      2

另一个方法是通过掩码过滤列名-此处转换为数字并测试列名是否更大,如2000

df = df.assign(Total=df.loc[:, pd.to_numeric(df.columns,errors='coerce')>2000].sum(axis=1))
print (df)
   id  name  2018  2019  2020  2021  2022 type  Total
0   1  John     0     1     0     0     2    A      3
1   2  Bill     1     5     4     0     0    B     10
2   3   Tom     0     0     2     0     5    B      7
3   4  Mary     0     1     1     0     0    A      2
t1rydlwq

t1rydlwq3#

您可以将assignfilter一起使用,并使用通用正则表达式表示4位数年份:

out = df.assign(Total=lambda d: d.filter(regex='^\d{4}$').sum(axis=1))

或使用drop和要忽略的列:

out = df.assign(Total=lambda d: d.drop(columns=['id', 'name', 'type', 'Total'],
                                       errors='ignore').sum(axis=1))

输出:

id  name  2018  2019  2020  2021  2022 type  Total
0   1  John     0     1     0     0     2    A      3
1   2  Bill     1     5     4     0     0    B     10
2   3   Tom     0     0     2     0     5    B      7
3   4  Mary     0     1     1     0     0    A      2

对列进行排序并更改所有整型列的类型:

out = (df.assign(Total=lambda d: d.filter(regex='^\d{4}$').sum(axis=1)
         .sort_index(key=lambda x: x.astype(str).str.fullmatch('\d{4}'), axis=1)
         .pipe(lambda d: d.astype({c: float for c in out.select_dtypes('number')}))
       )

输出:

id  name type  total  2018  2019  2020  2021  2022
0  1.0  John    A    3.0   0.0   1.0   0.0   0.0   2.0
1  2.0  Bill    B   10.0   1.0   5.0   4.0   0.0   0.0
2  3.0   Tom    B    7.0   0.0   0.0   2.0   0.0   5.0
3  4.0  Mary    A    2.0   0.0   1.0   1.0   0.0   0.0

相关问题