我缺少需要从一行到另一行并由单列连接的记录。
这是一个例子:
df1 = pd.DataFrame({'animal':['horse','cat','cat','dog'],
'type':['big','small',np.nan,'medium'],
'rating':[1,2,np.nan,2]})
print(df1)
输出:
animal rating type
0 horse 1 big
1 cat 2 small
2 cat NaN NaN
3 dog 2 medium
所需的输出:
animal rating type
0 horse 1 big
1 cat 2 small
2 cat 2 small
3 dog 2 medium
最佳答案
如果您的行并非总是正确地排列为ffill(),则可以通过将数据帧分为好和坏集,修复坏集并重新组合来实现相同的结果。例如:
df1 = pd.DataFrame({'animal':['horse','cat','cat','dog'],
'type':['big','small',np.nan,'medium'],
'rating':[1,2,np.nan,2]})
df1.set_index('animal',inplace=True)
good_df1 = df1[~df1.isnull().any(axis=1)]
bad_df1 = df1[df1.isnull().any(axis=1)]
final = pd.concat([good_df1, bad_df1.fillna(good_df1)]).reset_index()
这使:
animal rating type
0 horse 1.0 big
1 cat 2.0 small
2 dog 2.0 medium
3 cat 2.0 small
要仅填充某些列,请将最后一行替换为:
fill_cols = ['rating']
final = pd.concat([good_df1, bad_df1[fill_cols].fillna(good_df1[fill_cols])]).reset_index()
要么:
fill_cols = list(df1.columns)
fill_cols.remove('type')
final = pd.concat([good_df1, bad_df1[fill_cols].fillna(good_df1[fill_cols])]).reset_index()
或者,如果您的数据集允许,则可以使用前面提到的ffill(),但要执行额外的排序步骤以确保您的好数据排在首位:
df1.sort_values(['animal','rating','type']).fillna(method='ffill')
关于python - 如何用行中值与列匹配的行中的值填充N/A行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44771456/