如何根据两个不同列的值在一列中填充NaN

时间:2019-09-10 09:45:33

标签: python pandas data-analysis

我有一个包含三列的数据框。其中两个是组和子组,第三个是值。我在值列中有一些NaN值。我需要根据组和子组的中值来对它们进行筛选。

我制作了一个具有双索引和目标列中位数的数据透视表。但是我不明白如何获取这些值并将其放入原始数据帧

import pandas as pd
df=pd.DataFrame(data=[
[1,1,'A',1],
[2,1,'A',3],
[3,3,'B',8],
[4,2,'C',1],
[5,3,'A',3],
[6,2,'C',6],
[7,1,'B',2],
[8,1,'C',3],
[9,2,'A',7],
[10,3,'C',4],
[11,2,'B',6],
[12,1,'A'],
[13,1,'C'],
[14,2,'B'],
[15,3,'A']],columns=['id','group','subgroup','value'])

print(df)
    id  group subgroup  value
0    1      1        A      1
1    2      1        A      3
2    3      3        B      8
3    4      2        C      1
4    5      3        A      3
5    6      2        C      6
6    7      1        B      2
7    8      1        C      3
8    9      2        A      7
9   10      3        C      4
10  11      2        B      6
11  12      1        A    NaN
12  13      1        C    NaN
13  14      2        B    NaN
14  15      3        A    NaN

df_struct=df.pivot_table(index=['group','subgroup'],values='value',aggfunc='median')
print(df_struct)
                value
group subgroup       
1     A           2.0
      B           2.0
      C           3.0
2     A           7.0
      B           6.0
      C           3.5
3     A           3.0
      B           8.0
      C           4.0

非常感谢您的帮助

1 个答案:

答案 0 :(得分:0)

依次使用pandas.DataFrame.groupby.transformfillna

    id  group subgroup  value
0    1      1        A    1.0
1    2      1        A    NaN # < Value with nan
2    3      3        B    8.0
3    4      2        C    1.0
4    5      3        A    3.0
5    6      2        C    6.0
6    7      1        B    2.0
7    8      1        C    3.0
8    9      2        A    7.0
9   10      3        C    4.0
10  11      2        B    6.0

df['value'] = df['value'].fillna(df.groupby(['group', 'subgroup'])['value'].transform('median'))
print(df)

输出:

    id  group subgroup  value
0    1      1        A    1.0
1    2      1        A    1.0
2    3      3        B    8.0
3    4      2        C    1.0
4    5      3        A    3.0
5    6      2        C    6.0
6    7      1        B    2.0
7    8      1        C    3.0
8    9      2        A    7.0
9   10      3        C    4.0
10  11      2        B    6.0