【问题标题】:Filling values in a new df column based on values in another df根据另一个 df 中的值填充新 df 列中的值
【发布时间】:2020-12-29 07:20:47
【问题描述】:

我有两个数据框: 第一:

Job = {'Name': ["Ron", "Joe", "Dan"],
        'Job': [[2000, 2001], 1998, [2000, 1999]]
        }

df = pd.DataFrame(Job, columns = ['Name', 'Job'])
  Name           Job
0  Ron  [2000, 2001]
1  Joe          1998
2  Dan  [2000, 1999]

第二:

Empty = {'Name': ["Ron", "Ron", "Ron", "Ron", "Joe", "Joe", "Joe", "Joe", "Dan", "Dan", "Dan", "Dan"],
        'Year': [1998, 1999, 2000, 2001, 1998, 1999, 2000, 2001, 1998, 1999, 2000, 2001]
        }

df2 = pd.DataFrame(Empty, columns = ['Name', 'Year'])

    Name Year
0   Ron 1998
1   Ron 1999
2   Ron 2000
3   Ron 2001
4   Joe 1998
5   Joe 1999
6   Joe 2000
7   Joe 2001
8   Dan 1998
9   Dan 1999
10  Dan 2000
11  Dan 2001

我想向 df2 添加一列(我们称之为“job_status”),其中与 df1 中的名称相关联的每一年将在 df2 中收到 1,否则为 0。这应该是输出:

   Name  Year   job_status
0   Ron 1998      0
1   Ron 1999      0
2   Ron 2000      1
3   Ron 2001      1
4   Joe 1998      1
5   Joe 1999      0
6   Joe 2000      0
7   Joe 2001      0
8   Dan 1998      0
9   Dan 1999      1
10  Dan 2000      1
11  Dan 2001      0

我怎样才能做到这一点?

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

首先explode Job 上的数据框df 然后将其与df2 合并,最后使用Series.notna + view 将标签从[0, 1] 分配给job_status

d = df2.merge(df.explode('Job'), left_on=['Name', 'Year'], right_on=['Name', 'Job'], how='left')
d['job_status'] = d.pop('Job').notna().view('i1')

结果:

print(d)

   Name  Year  job_status
0   Ron  1998           0
1   Ron  1999           0
2   Ron  2000           1
3   Ron  2001           1
4   Joe  1998           1
5   Joe  1999           0
6   Joe  2000           0
7   Joe  2001           0
8   Dan  1998           0
9   Dan  1999           1
10  Dan  2000           1
11  Dan  2001           0

【讨论】:

猜你喜欢
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
  • 2022-06-10
  • 1970-01-01
  • 2016-09-19
  • 2022-12-03
  • 1970-01-01
相关资源
最近更新 更多