【问题标题】:Creating a single dataframe out of two columns each containing lists从每列包含列表的两列中创建单个数据框
【发布时间】:2016-02-01 09:39:16
【问题描述】:

我有一个如下所示的文件:

Location Code   Trait ID    Effective Date
WAU1    23984,24896,27576   06/05/2014 ,06/05/2014 ,06/12/2014 
WAU2    126973,219332   06/05/2014 ,06/05/2014 
WAU3    24375   06/05/2014 
WAU4    23984   06/05/2014 
WAU5    5199,23984  NULL
WAU6    12342,224123    06/05/2014 

请注意第二列和第三列是值的“列表”。某些行包含每个列表中元素数量的完全匹配,其他行丢失或根本不存在(null)。我需要创建一个类似于以下的单个数据框

   Location Code Trait ID  Effective Date
       0    WAU1    23984   06/05/2014
       1    WAU1    24896   06/05/2014
       2    WAU1    27576   06/12/2014
       3    WAU2    126973  06/05/2014
       4    WAU2    219332  06/05/2014
       5    WAU3    24375   06/05/2014
       6    WAU4    23984   06/05/2014
       7    WAU5    5199    NaN
       8    WAU5    23984   NaN
       9    WAU6    12342   06/05/2014
       10   WAU6    224123  NaN

我已经能够使用以下方法将每个“列表”列分成单独的数据框:

df1 = df1['Trait ID'].str.split(',').apply(pd.Series,1).stack()
df1.index = df1.index.droplevel(-1)
df1.name = 'Trait ID'
del df1['Trait ID']
df1 = df1.join(trait_id)

这给了我类似的东西:

  Location Code Trait ID
0          WAU1    23984
0          WAU1    24896
0          WAU1    27576
1          WAU2   126973
1          WAU2   219332
2          WAU3    24375
3          WAU4    23984
4          WAU5     5199
4          WAU5    23984
5          WAU6    12342
5          WAU6   224123

我可以使用上述相同的逻辑创建另一个带有“生效日期”列表的数据框,以生成以下内容:

  Location Code Effective Date
0          WAU1    06/05/2014 
0          WAU1    06/05/2014 
0          WAU1    06/12/2014 
1          WAU2    06/05/2014 
1          WAU2    06/05/2014 
2          WAU3    06/05/2014 
3          WAU4    06/05/2014 
4          WAU5            NaN
5          WAU6    06/05/2014 

我正在努力在 pandas 中找到合适的“函数”(例如 join、merge、concat)来将两个数据帧组合成我想要的输出。虽然我感觉它是它们的组合,但在某处有一个 reset_index()。

【问题讨论】:

  • 数据源是什么类型的“文件”?什么是分隔符(逗号、竖线、制表符)?它是否偶尔会错过这样的逗号?请问这个数据源(HTML、XML、RDMS等)的来源在哪里?
  • 它是一个制表符分隔的文件,在文件的第 2 列和第 3 列中,是由逗号分隔的一串值。我需要将第二列分成几行,然后如果第二列值的“原始”索引有匹配元素(如果这有任何意义),则将第三列“附加”到该行。否则,外推的行应该得到一个 Nan/NULL 等。

标签: python pandas dataframe


【解决方案1】:

开始于:

  Location Code             Trait ID                    Effective Date
0          WAU1  23984, 24896, 27576  06/05/2014,06/05/2014,06/12/2014
1          WAU2       126973, 219332             06/05/2014,06/05/2014
2          WAU3                24375               2014-06-05 00:00:00
3          WAU4                23984               2014-06-05 00:00:00
4          WAU5          5199, 23984                               NaN
5          WAU6        12342, 224123               2014-06-05 00:00:00

您可以groupby('Location Code'),对每个组使用str.split(',') withexpand=True, pivot the result usingstack()andconcat`:

df1.groupby('Location Code').apply(lambda x: pd.concat([x['Trait ID'].str.split(',', expand=True).stack(), x['Effective Date'].str.split(',', expand=True).stack()], axis=1)).reset_index([1, 2], drop=True)

得到:

                     0                    1
Location Code                              
WAU1             23984           06/05/2014
WAU1             24896           06/05/2014
WAU1             27576           06/12/2014
WAU2            126973           06/05/2014
WAU2            219332           06/05/2014
WAU3             24375  2014-06-05 00:00:00
WAU4             23984  2014-06-05 00:00:00
WAU5              5199                  nan
WAU5             23984                  NaN
WAU6             12342  2014-06-05 00:00:00
WAU6            224123                  NaN

【讨论】:

  • 我认为这可以解决问题!我会将它应用到更大的文件中,看看我是否遗漏了什么,但我认为我上面的测试用例涵盖了所有“用例”。感谢您的帮助和快速回复!
猜你喜欢
  • 2018-08-31
  • 2022-07-20
  • 2022-11-18
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
相关资源
最近更新 更多