根据现有单元格填充单元格

时间:2019-07-17 14:44:31

标签: python pandas

我的数据格式如下:

8A564   nan         json
8A928   nan         json
8A563   nan         json
8A564   10616280    json
8A563   10616222    json
8A564   nan         json
8B1BB   10982483    json
8A564   10616280    json

我想在第二列中填充数据,以匹配具有相同第一列且第二个非空值的行。所以我会得到以下消息:

8A564   10616280    json
8A928   nan         json
8A563   10616222    json
8A564   10616280    json
8A563   10616222    json
8A564   10616280    json
8B1BB   10982483    json
8A564   10616280    json

如何实现?

3 个答案:

答案 0 :(得分:4)

groupbybfill

请记住,0中的groupby(0)是指名为0的列。如果您的列使用其他名称,请使用该名称。

df.groupby(0).bfill()

       0         1     2
0  8A564  10616280  json
1  8A928       NaN  json
2  8A563  10616222  json
3  8A564  10616280  json
4  8A563  10616222  json
5  8A564  10616280  json
6  8B1BB  10982483  json
7  8A564  10616280  json

如果null的排序本身不适合回填,则可以获取第一个非null值。

df[1] = df.groupby(0)[1].transform('first')
df

       0         1     2
0  8A564  10616280  json
1  8A928       NaN  json
2  8A563  10616222  json
3  8A564  10616280  json
4  8A563  10616222  json
5  8A564  10616280  json
6  8B1BB  10982483  json
7  8A564  10616280  json

答案 1 :(得分:0)

您可以在表本身上进行内部联接以匹配值:

df_no_nan = df[~df.value.isnull()].drop_duplicates()
df['value'] = df.merge(df_no_nan, on='ID', how='left')['value_y']

输出:

      ID     value  type
0  8A564  10616280  json
1  8A928       NaN  json
2  8A563  10616222  json
3  8A564  10616280  json
4  8A563  10616222  json
5  8A564  10616280  json
6  8B1BB  10982483  json
7  8A564  10616280  json

答案 2 :(得分:0)

这是一条可以帮助您的python内衬纸。

df.iloc[:, [0,1]].groupby(0).apply(lambda x: x[1].fillna( np.nan if len(x[1].dropna()) == 0 else x[1].dropna().mode()[0])).reset_index()[[0,1]]

它使用分组方式,并且仅在满足某些条件时才填充。