将数据解析/反透视到熊猫数据框中的列中

Posted

技术标签:

【中文标题】将数据解析/反透视到熊猫数据框中的列中【英文标题】:Parse/unpivot data into the column in pandas dataframe 【发布时间】:2015-10-28 20:18:28 【问题描述】:

我有一个具有以下结构的 pandas DataFrame:

|A|B|C      |
-------------
|1|2|"1,2,4"|
|3|4|"5,6"  |

获取如下表的最 Pythonic 方式是什么?

|A|B|C|
-------
|1|2|1|
|1|2|2|
|1|2|4|
|3|4|5|
|3|4|6|

初始表包含约 10K 个实例,C 中包含 4-18 个元素。

目前我没有什么比:

import pandas as pd
df = pd.DataFrame([[1, 2, "1,2,4"], [3, 4, "5,6"]], columns=['A', 'B', 'C'])
tmp = df['C'].str.split(',').apply(pd.Series, 1).stack()
tmp.index = tmp.index.droplevel(-1)
tmp.name = 'C'
del df['C']
df = df.join(tmp)

【问题讨论】:

【参考方案1】:

也好不了多少。我做了两种方式。第一个与您的相似,但有一些外观差异,感觉像是两者中的佼佼者。我仍然添加了第二个,因为它有点不同,它连接了 split 返回的系列。

>>> import pandas as pd
>>> df = pd.DataFrame([[1, 2, "1,2,4"], [3, 4, "5,6"]], columns=['A', 'B', 'C'])
>>> x = df.drop('C', axis=1).join(df.C.str.split(',', expand=True).stack().to_frame('C').reset_index(1, drop=True))
>>> print x
   A  B  C
0  1  2  1
0  1  2  2
0  1  2  4
1  3  4  5
1  3  4  6

>>> y = df.drop('C', axis=1).join(pd.concat(df.C.str.split(',', expand=True).to_dict('series').values()).dropna().to_frame('C'))
>>> print y
   A  B  C
0  1  2  1
0  1  2  2
0  1  2  4
1  3  4  5
1  3  4  6

【讨论】:

【参考方案2】:

你可以通过 for 循环来做到这一点:

with open("your_file") as f:
    for i,line in enumerate(f):
        if i==1:
            print line
        else:
            line = line.split("|")
            elements = line[-1].strip("\" ").split(",")
            for x in elements:
                print "|||".format("|".join(line[:2]), x)

【讨论】:

以上是关于将数据解析/反透视到熊猫数据框中的列中的主要内容,如果未能解决你的问题,请参考以下文章

如何从包含文本的熊猫数据框中的列中提取年份(或日期时间)

如何从熊猫数据框中的列中删除字符串值

确定熊猫数据框中的列值何时更改

如何在熊猫数据框中的所有列中搜索模式,并在找到时将其复制到另一列

用上一列中的值填充熊猫数据框中的“无”值

将前导零添加到 Spark 数据框中的列 [重复]