数据框

时间:2017-09-11 05:43:00

标签: python pandas return

我试图在数据帧中取每个第五行和每第六行var A的平均值,并将结果作为var B放在一个新列中。但NaN显示。可能是因为我没有正确返回值?

以下是示例数据:

PID    A     
1      0
1      3
1      2
1      6
1      0
1      2
2      3
2      3
2      1
2      4
2      0
2      4

预期结果:

PID    A      B  
1      0      1
1      3      1
1      2      1
1      6      1
1      0      1
1      2      1
2      3      2
2      3      2
2      1      2
2      4      2
2      0      2
2      4      2

我的代码:

lst1 = df.iloc[5::6, :] 
lst2 = df.iloc[4::6, :]  

df['B'] = (lst1['A'] + lst2['A'])/2
print(df['B'])

脚本可以无误地运行,但var B为空并显示NaN。 谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

问题数据未对齐,因为索引不同,因此请NaN s。

print(lst1)
    PID  A
5     1  2
11    2  4

print(lst2)
    PID  A
4     1  0
10    2  0

print (lst1['A'] + lst2['A'])
4    NaN
5    NaN
10   NaN
11   NaN
Name: A, dtype: float64

解决方案是使用valuesSeries添加到numpy array

print (lst1['A'] + (lst2['A'].values))
5     2
11    4
Name: A, dtype: int64

或者你可以总结2个numpy数组:

print (lst1['A'].values + (lst2['A'].values))
[2 4]

似乎你需要:

df['B'] = (lst1['A'] + lst2['A'].values).div(2)
df['B'] = df['B'].bfill()
print(df)
    PID  A    B
0     1  0  1.0
1     1  3  1.0
2     1  2  1.0
3     1  6  1.0
4     1  0  1.0
5     1  2  1.0
6     2  3  2.0
7     2  3  2.0
8     2  1  2.0
9     2  4  2.0
10    2  0  2.0
11    2  4  2.0

但如果mean需要5. 6. PID每个值df['B'] = df.groupby('PID').transform(lambda x: x.iloc[[4, 5]].mean()) print(df) PID A B 0 1 0 1.0 1 1 3 1.0 2 1 2 1.0 3 1 6 1.0 4 1 0 1.0 5 1 2 1.0 6 2 3 2.0 7 2 3 2.0 8 2 1 2.0 9 2 4 2.0 10 2 0 2.0 11 2 4 2.0 ,请groupby使用transform

<div class="wrapper">
  <article>
    <div style="float:left;width:100%" class="one">One</div>
    <div style="float:left;width:100%" class="two">Two</div>
    <div style="float:left;width:70%" class="three">Three</div>
  </article>
 <div  style="float:left;width:30%" class="four">Four</div>
</div>

答案 1 :(得分:1)

选项1
采用'PID'定义的每个组中第5和第6位的平均值的直接方式。

df.assign(B=df.groupby('PID').transform(lambda x: x.values[[4, 5]].mean()))

    PID  A    B
0     1  0  1.0
1     1  3  1.0
2     1  2  1.0
3     1  6  1.0
4     1  0  1.0
5     1  2  1.0
6     2  3  2.0
7     2  3  2.0
8     2  1  2.0
9     2  4  2.0
10    2  0  2.0
11    2  4  2.0

选项2
使用join的有趣方式,假设每个'PID'实际上只有6行。

df.join(df.set_index('PID').A.pipe(lambda d: (d.iloc[4::6] + d.iloc[5::6]) / 2).rename('B'), on='PID')

    PID  A    B
0     1  0  1.0
1     1  3  1.0
2     1  2  1.0
3     1  6  1.0
4     1  0  1.0
5     1  2  1.0
6     2  3  2.0
7     2  3  2.0
8     2  1  2.0
9     2  4  2.0
10    2  0  2.0
11    2  4  2.0