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

2024-10-06 03:59:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个三列的数据框。其中两个是群和子群,第三个是值。我在values列中有一些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

会感谢你的帮助


Tags: 数据id目标df原始数据valuegroupnan
1条回答
网友
1楼 · 发布于 2024-10-06 03:59:29

使用pandas.DataFrame.groupby.transform然后fillna

    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

相关问题 更多 >