我的数据格式如下:
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
如何实现?
答案 0 :(得分:4)
groupby
和bfill
请记住,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]]
它使用分组方式,并且仅在满足某些条件时才填充。