Parse/unpivot 数据进入 pandas 数据框中的列
Parse/unpivot data into the column in pandas dataframe
我有一个具有以下结构的 pandas DataFrame:
|A|B|C |
-------------
|1|2|"1,2,4"|
|3|4|"5,6" |
获得如下所示 table 的最 pythonic 方法是什么?
|A|B|C|
-------
|1|2|1|
|1|2|2|
|1|2|4|
|3|4|5|
|3|4|6|
初始 table 包含约 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)
你可以通过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)
好不了多少。我用两种方式做到了。第一个与您的相似,但在外观上有所不同,感觉是两者中更好的一个。我仍然添加了第二个,因为它有点不同,因为它连接了 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
我有一个具有以下结构的 pandas DataFrame:
|A|B|C |
-------------
|1|2|"1,2,4"|
|3|4|"5,6" |
获得如下所示 table 的最 pythonic 方法是什么?
|A|B|C|
-------
|1|2|1|
|1|2|2|
|1|2|4|
|3|4|5|
|3|4|6|
初始 table 包含约 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)
你可以通过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)
好不了多少。我用两种方式做到了。第一个与您的相似,但在外观上有所不同,感觉是两者中更好的一个。我仍然添加了第二个,因为它有点不同,因为它连接了 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