【问题标题】:Get list of columns in which data differs for consecutive rows获取连续行的数据不同的列列表
【发布时间】:2019-11-13 00:56:34
【问题描述】:

我有一个表在连续的行中有重复的行。具有相同“id”的行在其他列中应该有重复的数据。但是很少有数据不正确的行。例如 -

id  Name    Age
1   Ram     12
1   Ram     10
2   Shyam   11
2   Yam     11
3   Ravi    23
3   Ravi    23
4   Harsh   34
4   Harsh   34

我需要知道连续行的列不同的列。

我需要的最终输出 -

id  Name    Age     DifferentColumn
1   Ram     12      
1   Ram     10      Age
2   Shyam   11
2   Yam     11      Name
3   Ravi    23 
3   Ravi    23
4   Harsh   34
4   Krish   54      Name,Age

我可以为此使用“petl”或“pandas”,但我的方法应该是什么?

【问题讨论】:

  • 3 Ravi 23 也应该是姓名和年龄吧?还是按 id 分组?
  • 不,两行都有重复数据。所以,是正确的
  • 所以每 2 行分组对吗?
  • 是的,两行分组

标签: python-3.x pandas dataframe petl


【解决方案1】:

好的,这可行

   id   Name  Age
0   1    Ram   12
1   1    Ram   10
2   2  Shyam   11
3   2    Yam   11
4   3   Ravi   23
5   3   Ravi   23
6   4  Harsh   34
7   4  Krish   54

df['Match'] = df.groupby('id').apply(lambda x: [' ','Name,Age'] if ((len(set(x.Name)) > 1) and (len(set(x.Age)) > 1)) else [' ','Age'] if len(set(x.Age)) > 1 else [' ','Name'] if ((len(set(x.Name)) > 1)) else [' ',' ']).reset_index(name='Match').apply(lambda x: pd.Series(x.Match), axis=1).stack().reset_index(drop=True)

发生了什么

pd.groupby 通过 id,然后直接 if 条件来验证姓名和年龄不同或相同的位置。步骤创建如下所示的内容

   id          Match
0   1       [ , Age]
1   2      [ , Name]
2   3         [ ,  ]
3   4  [ , Name,Age]

接下来,只需打开列表并将它们堆叠起来。

输出

  id   Name  Age     Match
0   1    Ram   12          
1   1    Ram   10       Age
2   2  Shyam   11          
3   2    Yam   11      Name
4   3   Ravi   23          
5   3   Ravi   23          
6   4  Harsh   34          
7   4  Krish   54  Name,Age

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 2017-08-02
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 2012-10-21
    相关资源
    最近更新 更多