如何解决如何通过限制数据框中的行大小来查找列总和?
有一个数据框df1:
DP 1 DP 2 DP 3 DP 4 DP 5 DP 6 DP 7 DP 8 DP 9 DP 10
OP 1 357848 1124788 1735330 2218270 2745596 3319994 3466336 3606286 3833515 3901463
OP 2 352118 1236139 2170033 3353322 3799067 4120063 4647867 4914039 5339085
OP 3 290507 1292306 2218525 3235179 3985995 4132918 4628910 4909315
OP 4 310608 1418858 2195047 3757447 4029929 4381982 4588268
OP 5 443160 1136350 2128333 2897821 3402672 3873311
OP 6 396132 1333217 2180715 2985752 3691712
OP 7 440832 1288463 2419861 3483130
OP 8 359480 1421128 2864498
OP 9 376686 1363294
OP 10 344014
我想通过限制行数来计算每列的总和。
To calculate sum of first column data,Sum(DP1) where row size should be 10-1
To calculate sum of second column data,Sum(DP2) where row size should be 10-2
To calculate sum of Third column data,Sum(DP3) where row size should be 10-3
等等..
输出是这样的:
3327371 10251249 15047844 18447791 17963259 15954957 12743113 8520325 3833515
我尝试使用 for 循环:
>>dataframe_len = len(df1.columns)
>>print(dataframe_len)
10
>>for i in range(0,10):
#Here i need to find the sum of each column
#sum('col')(row size is 10-i)
不是关于 DP1 到 DP10(10 列),那里的列太多了。
感谢您的光临:)
解决方法
假设您希望按照您的预期输出而不是根据您的描述,在删除 NA 值然后跳过最后一个值后sum()
每一列:
df.apply(lambda col: col.dropna()[:-1].sum())
输出:
DP 1 3327371.0
DP 2 10251249.0
DP 3 15047844.0
DP 4 18447791.0
DP 5 17963259.0
DP 6 15954957.0
DP 7 12743113.0
DP 8 8520325.0
DP 9 3833515.0
DP 10 0.0
附注:您的总和不是第 10-1、10-2、10-3 行等,而是第 9-1、8-1、7-1 行。 IE。您正在跳过每列的最后非 NA 值,而不是顶部的行。
Ex df['DP 1'].sum()
是 3671385
但跳过最后一行 df['DP 1'][:-1].sum()
是 3327371
与您的预期输出匹配。对于 DP2:df['DP 2'].sum()
是 11614543
,df['DP 2'].dropna()[:-1].sum()
是 10251249
(您的预期值)但 df['DP 2'][2:10].sum()
是 9253616
。
在这种情况下,您可以总结为倒数第二个last_valid_index()
:
df.apply(lambda x: x.iloc[:df.index.get_loc(x.last_valid_index())].sum())
# DP 1 3327371.0
# DP 2 10251249.0
# DP 3 15047844.0
# DP 4 18447791.0
# DP 5 17963259.0
# DP 6 15954957.0
# DP 7 12743113.0
# DP 8 8520325.0
# DP 9 3833515.0
# DP 10 0.0
,
我认为您可以在使用 apply()
时利用列名中的信息
def sum_row(col):
t = int(col.name.split(' ')[-1])
return col.iloc[:-t].sum()
df_ = df.apply(sum_row)
# print(df_)
DP 1 3327371.0
DP 2 10251249.0
DP 3 15047844.0
DP 4 18447791.0
DP 5 17963259.0
DP 6 15954957.0
DP 7 12743113.0
DP 8 8520325.0
DP 9 3833515.0
DP 10 0.0
dtype: float64
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。