如何在python

时间:2017-11-10 16:15:48

标签: python pandas group-by pandas-groupby fillna

我正在尝试填充数据框中的缺失值。但是我想用groupby语句填充缺少的列。所以这就是我的数据框架的样子......

Number    Other
1435       NaN
1435       NaN
1435       COOL
1817       NaN
1817       YES

所以我想要做的就是基本上只取最大值或最后一个有数据的值并用该值填充该特定数字的na .....所以例如对于1435我想要按编号对其进行分组,然后在该列中查找max(),以便找到COOL然后用COOL填充另一列中的所有NaN,我的最终数据框将如下所示

Number    Other
1435       COOL
1435       COOL
1435       COOL
1817       YES
1817       YES

到目前为止我的尝试。

df["Number"] = df["Number"].fillna(value=df.groupby(['Number'])["Other"].max())

以及

df["Number"] = df["Number"].fillna(value=df.groupby(['Number'])["Other"].last())

我认为我需要做的是对它们进行排序,然后使用last来获取值,但我似乎无法弄清楚如何执行此操作并返回我正在寻找的结果。非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

看起来你想要的只是groupby + bfill

df['Other'] = df.groupby('Number').Other.bfill()
df

   Number Other
0    1435  COOL
1    1435  COOL
2    1435  COOL
3    1817   YES
4    1817   YES

答案 1 :(得分:1)

我认为这与此处所述的问题相同:

Pandas Fill NA with Group Value 如果你想要,例如要使用最常用的值,您可以执行以下操作:

df = pd.DataFrame([[1435, np.nan],
                   [1435, 'YES'],
                   [1435, np.nan],
                   [1435, 'COOL'],
                   [1435, 'COOL'],
                   [1817, np.nan],
                   [1817, 'YES']],
                   columns=['Number', 'Other'])

df['Other'] = df.groupby('Number').transform(lambda x: x.fillna(x.value_counts().index[0]))

这将导致

    Number  Other
0   1435    COOL
1   1435    YES
2   1435    COOL
3   1435    COOL
4   1435    COOL
5   1817    YES
6   1817    YES

所以结合方法groupby,transform和fillna。

答案 2 :(得分:0)

要填写上一个可用值,请尝试

df["Number"]=df["Number"].bfill()