Python 如何使用列上值匹配的行中的值填写N/a行

Python 如何使用列上值匹配的行中的值填写N/a行,python,pandas,Python,Pandas,我缺少需要从一行传送到另一行并由一列连接的记录 下面是一个例子: 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

我缺少需要从一行传送到另一行并由一列连接的记录

下面是一个例子:

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()
或:

或者,如果您的数据集允许,您可以如上所述使用ffill(),但需要额外的排序步骤,以确保您的好数据首先出现:

df1.sort_values(['animal','rating','type']).fillna(method='ffill')

非常感谢。有没有办法忽略某些列,如“type”?当然,在上面添加了两种方式,白名单或黑名单
df1.sort_values(['animal','rating','type']).fillna(method='ffill')