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

发布于 2025-01-09 08:23:21 字数 687 浏览 0 评论 0 原文

我有一个 pandas 数据框(df1),其中有一列包含一些“NaN”值,我想将其替换为另一个数据框(df2)中的值。

这是必须映射的带有 NaN 的数据帧 (df1) 的一部分:

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

I have a pandas data frame (df1) with a column that has some 'NaN' values that I want to replace with the values that I have in another data frame (df2).

This is a part of the data frame (df1) with NaN that has to be mapped:

reporting_date_id   filing_date_id
    19910930          NaN
    19920930          NaN

This is the dataframe (df2) that I want to use to map, it's a bit tricky cause they have the same column name

reporting_date_id   filing_date_id
    19910930          19911118
    19920930          19921116
    19930930          19931122

I was trying to do it in this way but it doesn't seems to work

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

巾帼英雄 2025-01-16 08:23:21

您可以通过 reporting_date_id 映射到另一个 DataFrame。 Series.map.html" rel="nofollow noreferrer">Series.map 然后用它来替换 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))

You can mapping column reporting_date_id by another DataFrame by 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))
红尘作伴 2025-01-16 08:23:21

按索引对齐并使用 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

Align by index and use fillna. Then reset the index again.

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

Demo:

>>> 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
水水月牙 2025-01-16 08:23:21

更喜欢@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

Output

reporting_date_idfiling_date_id 我个人
19910930 19911118
19920930 19911118

I personally prefer @jezrael answer, but if you are interested in using a for loop over the dataframe rows, you can use code below:

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

Output

reporting_date_id filing_date_id
19910930 19911118
19920930 19911118
贵在坚持 2025-01-16 08:23:21
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
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)

This will keep both of the columns in case both have different values for the same reporting_date_id. If not you can always drop the NaN column as I did above.

Output:

   repdateid filing_date_id_x  filing_date_id_y
0   19910930             None          19911118
1   19920930             None          19921116
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文