【问题标题】:Keep just duplicate indices after append on pandas在熊猫上追加后只保留重复的索引
【发布时间】:2019-02-03 12:19:17
【问题描述】:

我正在尝试形成一个时间序列,并附加了 2014 年和 2015 年数据库中的数据。问题是,我只需要观察我的身份证两年都在哪里。我知道如何在水平合并中做到这一点,但是有没有办法通过追加来做到这一点?或者,有没有办法重塑我的合并数据?

我的数据如下所示:

df14

id year value1 value2
1  2014   a       x
2  2014   b       y

df15:

id year value1 value2
2  2015   c       w
3  2015   d       z

在这种情况下,我只想要一个如下所示的 DataFrame:

id year value1 value2
2  2015   c       w
2  2014   b       y

但是df14.append(df15) 带来了完整的追加,并且没有索引匹配选项。

有没有办法做到这一点?找不到它,即使它应该很简单。

提前致谢

【问题讨论】:

  • 您可能想要groupby(id) 并根据它进行过滤。

标签: python pandas dataframe append


【解决方案1】:

您可以将duplicatedkeep=False 参数一起使用来子集连接的DataFrame

df = pd.concat([df14, df15], ignore_index=True)
df[df.duplicated('id', keep=False)]

输出:

   id  year value1 value2
1   2  2014      b      y
2   2  2015      c      w

对于温的观点,如果在一帧中有重复,并且您只需要选择不同年份的重复,则使用transform进行子集。

df[df.groupby('id').year.transform(lambda x: x.nunique() > 1)]
# or 
df.groupby('id').filter(lambda x: x.year.nunique() > 1)

【讨论】:

  • 当df14的id本身有重复时,输出不正确。
  • 我想这是一个很好的观点。虽然由于它们来自数据库,但很有可能id 是主键,因此它不会在每一帧中重复。
  • 没错,那些是唯一标识符,所以,至少对于我的问题,它就像一个魅力!谢谢 ALollz。
【解决方案2】:
  1. 将索引设置为两个数据框的 'id'
  2. align 方法与inner 参数结合使用
  3. 附加数据帧并重置索引

d14, d15 = df14.set_index('id').align(df15.set_index('id'), 'inner')

d14.append(d15).reset_index()

   id  year value1 value2
0   2  2014      b      y
1   2  2015      c      w

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-25
    • 2020-03-11
    • 2018-11-05
    • 1970-01-01
    • 2015-11-23
    • 2021-10-12
    • 2019-02-22
    • 2017-09-21
    相关资源
    最近更新 更多