0

我看到了这个问题的各种版本,但它们似乎都不适合我正在尝试做的事情:这是我的数据:

这是带有 s 的 df NaN

df = pd.DataFrame({"A": ["10023", "10040", np.nan, "12345", np.nan, np.nan, "10033", np.nan, np.nan],
               "B": [",", "17,-6", "19,-2", "17,-5", "37,-5", ",", "9,-10", "19,-2", "2,-5"],
               "C": ["small", "large", "large", "small", "small", "large", "small", "small", "large"]})

       A      B      C
0  10023      ,  small
1  10040  17,-6  large
2    NaN  19,-2  large
3  12345  17,-5  small
4    NaN  37,-5  small
5    NaN      ,  large
6  10033  9,-10  small
7    NaN  19,-2  small
8    NaN   2,-5  large

接下来我有一个名为 df 的查找df2

df2 = pd.DataFrame({"B": ['17,-5', '19,-2', '37,-5', '9,-10'],
                "A": ["10040", "54321", "12345", "10033"]})

       B      A
0  17,-5  10040
1  19,-2  54321
2  37,-5  12345
3  9,-10  10033

我想通过查找列并返回来填充列的NaNs,以使结果如下所示:Adfdf2.Bdf2.Adfr

       A      B      C
0  10023      ,  small
1  10040  17,-6  large
2  54321  19,-2  large
3  10040  17,-5  small
4  12345  37,-5  small
5    NaN      ,  large
6  10033  9,-10  small
7  54321  19,-2  small
8    NaN   2,-5  large

重要警告:

  1. dfs 没有匹配的索引
  2. df.A和的内容df2.A是非唯一的()
  3. do的行df2组成了唯一的对。
  4. 假设有更多列,未显示,NaNs。

df使用 pandas,可以通过以下方式找到(我认为)感兴趣的行: df.loc[df['A'].isnull(),]这个答案似乎很有希望,但我不清楚df1该示例的来源。我的实际数据集比这大得多,我将不得不以这种方式替换几列。

4

2 回答 2

1

Wen-Ben的map方法在速度方面会更快,但这里有另一种方法可以解决这个问题,只是为了您的方便和知识

您可以使用pd.merge,因为这基本上是一个join问题。合并后,我们填充并删除不需要的列。

df_final = pd.merge(df, df2, on='B', how='left', suffixes=['_1','_2'])
df_final['A'] = df_final.A_1.fillna(df_final.A_2)
df_final.drop(['A_1', 'A_2'], axis=1, inplace=True)

print(df_final)
       B      C      A
0      ,  small  10023
1  17,-6  large  10040
2  19,-2  large  54321
3  17,-5  small  12345
4  37,-5  small  12345
5      ,  large    NaN
6  9,-10  small  10033
7  19,-2  small  54321
8   2,-5  large    NaN
于 2019-03-11T00:39:33.577 回答
1

只是使用np.where

df.A=np.where(df.A.isnull(),df.B.map(df2.set_index('B').A),df.A)
df
Out[149]: 
       A      B      C
0  10023      ,  small
1  10040  17,-6  large
2  54321  19,-2  large
3  12345  17,-5  small
4  12345  37,-5  small
5    NaN      ,  large
6  10033  9,-10  small
7  54321  19,-2  small
8    NaN   2,-5  large
于 2019-03-10T23:50:36.140 回答