Python 如何通过限制dataframe中的行大小来查找列和?
具有数据帧df1:Python 如何通过限制dataframe中的行大小来查找列和?,python,pandas,dataframe,triangle,Python,Pandas,Dataframe,Triangle,具有数据帧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 4
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
我想通过限制行数来计算每一列的总和
要计算第一列数据的总和,行大小应为10-1的总和(DP1)
要计算第二列数据之和,行大小应为10-2的sum(DP2)
要计算第三列数据之和,行大小应为10-3的sum(DP3)
等等
输出如下:
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列)无关,因为有太多的列
谢谢您的时间:)我认为您可以在使用
apply()时利用列名中的信息
def sum_行(列):
t=int(列名称拆分(“”)[-1])
返回col.iloc[:-t].sum()
df_u=df.apply(求和行)
我认为在使用apply()
def sum_行(列):
t=int(列名称拆分(“”)[-1])
返回col.iloc[:-t].sum()
df_u=df.apply(求和行)
假设您希望它符合您的预期输出,而不是您的描述,sum()
在删除NA值然后跳过最后一个值后的每一列:
df.apply(lambda列: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行。即,跳过每列的最后一个非NA值,而不是最上面的行
Exdf['DP 1'].sum()
是3671385
但跳过了最后一行df['DP 1'][:-1]。sum()
是与预期输出匹配的3327371
。对于DP2:df['DP 2'].sum()
是11614543
和df['DP 2'].dropna()[:-1].sum()
是10251249
(您预期的val),但df['DP 2'][2:10]。sum()
是
删除NA值然后跳过最后一个值后的每列:
df.apply(lambda列: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行。即,跳过每列的最后一个非NA值,而不是最上面的行
Exdf['DP 1'].sum()
是3671385
但跳过了最后一行df['DP 1'][:-1]。sum()
是与预期输出匹配的3327371
。对于DP2:df['DP 2'].sum()
是11614543
和df['DP 2'].dropna()[:-1]。sum()
是10251249
(您预期的val),但df['DP 2'][2:10]。sum()
是9253616
,,在这种情况下,您可以求和到倒数第二个最后一个有效的索引()
df.apply(lambda x:x.iloc[:df.index.get_loc(x.last_valid_index())].sum())
#DP 1327271.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
在这种情况下,您可以汇总到倒数第二个last\u valid\u index()
:
df.apply(lambda x:x.iloc[:df.index.get_loc(x.last_valid_index())].sum())
#DP 1327271.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
ah更好,+1。我在shift(-1)方面做得太复杂了。上一个有效的\u index()
我从你放的东西开始(但由于每列的移位量不同,所以无法使它工作)。然后意识到我们只是跳过了最后一个值。啊,更好,+1。我在shift(-1)方面做得太复杂了。上一个有效的\u index()
我从你放的东西开始(但由于每列的移位量不同,所以无法使它工作)。然后意识到我们只是跳过了最后一个值。10-1
是指10比1
还是10减1
?你是想跳过最上面一行还是最下面一行?根据您的预期输出,它看起来像是跳过了底部的行;或者,跳过最后一个非NA值。10-1
是指10到1
还是10减去1
?你是想跳过最上面一行还是最下面一行?根据您的预期输出,它看起来像是跳过了底部的行;或者更确切地说,跳过最后一个非NA值。