将列数据框与另一个数据框映射

Mapping column dataframe with another dataframe

我有一个 pandas 数据框 (df1),其中有一列有一些 'NaN' 值,我想用另一个数据框 (df2) 中的值替换这些值。

这是数据框 (df1) 中必须映射的 NaN 的一部分:

reporting_date_id   filing_date_id
    19910930          NaN
    19920930          NaN

这是我想用来映射的数据框 (df2),这有点棘手,因为它们具有相同的列名

reporting_date_id   filing_date_id
    19910930          19911118
    19920930          19921116
    19930930          19931122

我试过用这种方式做,但似乎行不通

for n in range(len(df1)):
    if df1['filing_date_id'].isna().loc[n]==True:
        fix_date=df2[df2['reporting_date_id']==df1['reporting_date_id'].loc[n]]['filing_date_id']
        df1['filing_date_id'].loc[n]=fix_date

您可以将列 reporting_date_id 映射到另一个 DataFrame 通过 Series.map and then use it for replace missing values in Series.fillna:

s = df2.set_index('reporting_date_id')['filing_date_id']
df1['filing_date_id'] = df1['filing_date_id'].fillna(df1['reporting_date_id'].map(s))
import pandas as pd

df1 = pd.DataFrame(
    {
        "reporting_date_id": [19910930, 19920930],
        "filing_date_id": [None, None],
    }
)
#    repdateid filing_date_id
# 0   19910930           None
# 1   19920930           None

df2 = pd.DataFrame(
    {
        "reporting_date_id": [19910930, 19920930, 19930930],
        "filing_date_id": [19911118, 19921116, 19931122],
    }
)
# repdateid  filing_date_id
# 0   19910930        19911118
# 1   19920930        19921116
# 2   19930930        19931122

result = pd.merge(df1, df2, on=["reporting_date_id", "reporting_date_id"])

result.drop(['filing_date_id_x'], axis=1)

这将保留两列,以防同一列的值不同 reporting_date_id。如果没有,您可以像我上面那样删除 NaN 列。

输出:

   repdateid filing_date_id_x  filing_date_id_y
0   19910930             None          19911118
1   19920930             None          19921116

按索引对齐并使用 fillna。然后重新设置索引。

idx = 'reporting_date_id'
result = df1.set_index(idx).fillna(df2.set_index(idx)).reset_index()

演示:

>>> df1
   reporting_date_id  filing_date_id
0           19910930             NaN
1           19920930             NaN
>>> df2
   reporting_date_id  filing_date_id
0           19910930        19911118
1           19920930        19921116
2           19930930        19931122
>>> idx = 'reporting_date_id'
>>> result = df1.set_index(idx).fillna(df2.set_index(idx)).reset_index()
>>> result
   reporting_date_id  filing_date_id
0           19910930      19911118.0
1           19920930      19921116.0

我个人更喜欢@jezrael 的回答,但如果您有兴趣在数据框行上使用 for 循环,您可以使用以下代码:

df1.set_index("reporting_date_id", inplace=True)
df2.set_index("reporting_date_id", inplace=True)
for index, row in df1.iterrows():
  if row["filing_date_id"] != row["filing_date_id"] or row["filing_date_id"] == None:
    df1.loc[index , "filing_date_id"] = df2.loc[index]["filing_date_id"]
df1

输出

reporting_date_id filing_date_id
19910930 19911118
19920930 19911118