Python:在数据框架中,如何查找一列中的字符串出现在另一列中的年份?

2024-05-29 07:09:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,希望循环遍历c2列中的所有字符串,打印该字符串和它在c2列中出现的年份,然后还打印它在c1列中出现时的第一年,如果它在c1列中存在的话。然后在另一列中统计年份之间的差异c2中存在NaN值。

示例df:

id   year     c1                c2
0    1999     luke skywalker    han solo
1    2000     leia organa       r2d2
2    2001     han solo          finn
3    2002     r2d2              NaN
4    2004     finn              c3po
5    2002     finn              NaN
6    2005     c3po              NaN

打印结果示例:

c2            year in c2   year in c1     delta
han solo      1999         2001           2
r2d2          2000         2002           2
finn          2001         2004           3
c3po          2004         2005           1

我正在使用Python和熊猫的Jupyter笔记本。谢谢


Tags: 数据字符串in示例差异nanyearsolo
2条回答

您可以按如下步骤进行操作:

df1 = df[df.c2.notnull()].copy()

s = df.groupby('c1')['year'].first()
df1['year in c1'] = df1.c2.map(s)

df1 = df1.rename(columns={'year':'year in c2'})

df1['delta'] = df1['year in c1'] - df1['year in c2']

print(df1[['c2','year in c2','year in c1', 'delta']])

输出:

         c2  year in c2  year in c1  delta
0  han solo        1999        2001      2
1      r2d2        2000        2002      2
2      finn        2001        2004      3
4      c3po        2004        2005      1

这里有一个方法

df['year_c1'] = df['c2'].map(df.groupby('c1')['year'].agg('first'))\
                        .fillna(0).astype(int)

df = df.rename(columns={'year': 'year_c2'})
df['delta'] = df['year_c1'] - df['year_c2']

df = df.loc[df['c2'].notnull(), ['id', 'year_c2', 'year_c1', 'delta']]

#    id  year_c2  year_c1  delta
# 0   0     1999   2001.0      2
# 1   1     2000   2002.0      2
# 2   2     2001   2004.0      3
# 4   4     2004   2005.0      1

解释

  • c1映射到year,按“第一个”聚合
  • c2上使用此映射计算year_c1
  • 计算delta作为year_c2year_c1之间的差值
  • 删除c2和order列中带有null的行

相关问题 更多 >

    热门问题