簡體   English   中英

解析/取消透視數據到pandas數據框中的列

[英]Parse/unpivot data into the column in pandas dataframe

我有一個具有以下結構的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|

初始表包含〜10,000個實例,其中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)

不會好多了。 我做到了兩種方式。 第一個與您的相似,但有一些外觀上的區別,並且感覺兩者之間更好。 我仍然添加第二個,因為它有點不同,因為它組合了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

您可以通過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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM