将列数据框与另一个数据框映射
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
我有一个 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 |