根据两列中的文本拆分行(Python、Pandas)
Split rows according to text in two columns (Python, Pandas)
这是我的数据框(有更多的字母,长度约为 35.5k)以及 – 是其他相关字符串的内容)。所有变量都是字符串,['C1','C2'] 是 MultiIndex.
tmp
C1 C2 C3 C4 C5 Start End C8
A 1 - - - 12 14 -
A 2 - - - 1,4,7 3,6,10 -
A 3 - - - 16,19 17,21 -
A 4 - - - 22 24 -
我需要它变成这样(拆分包含逗号的每一行以维护其他所有内容):
C1 C2 C3 C4 C5 Start End C8 Appearance
A 1 - - - 12 14 - 1
A 2 - - - 1 3 - 1
A 2 - - - 4 6 - 2
A 2 - - - 7 10 - 3
A 3 - - - 16 17 - 1
A 3 - - - 19 21 - 2
A 4 - - - 22 24 - 1
我试过这个脚本
pandas: How do I split text in a column into multiple rows?
作为
s = tmp['Start'].str.split(',').apply(Series, 1).stack()
s.index = s.index.droplevel(-1)
s.name = 'Start
del tmp['Start']
final = tmp.join(s)
但是结果比它应该的要大得多!我得到了数千次重复,这只是试图拆分 'Start'。我什至无法想象尝试对 Start 和 End 都这样做('Start' 中的每个逗号都表示 'End'.
中的逗号
Lengths:
tmp = 35568
s = 35676
final = 293408
您可以从 s1
和 s2
创建新的 df
,然后 join
. Also better is use parameter expand=True
in str.split
and delete multiple columns by drop
:
要创建列 Appearance
,请使用 groupby
by index
和 cumcount
。
s1 = tmp['Start'].str.split(',', expand=True).stack()
s1.index = s1.index.droplevel(-1)
s1.name = 'Start'
s2 = tmp['End'].str.split(',', expand=True).stack()
s2.index = s2.index.droplevel(-1)
s2.name = 'End'
tmp.drop(['Start', 'End'], inplace=True, axis=1)
df = pd.DataFrame({'s1':s1, 's2':s2}, index=s1.index)
final = tmp.join(df)
final['Appearance'] = final.groupby(final.index).cumcount() + 1
print (final)
C1 C2 C3 C4 C5 C8 s1 s2 Appearance
0 A 1 - - - - 12 14 1
1 A 2 - - - - 1 3 1
1 A 2 - - - - 4 6 2
1 A 2 - - - - 7 10 3
2 A 3 - - - - 16 17 1
2 A 3 - - - - 19 21 2
3 A 4 - - - - 22 24 1
通过评论编辑:
你可以先试试reset_index
:
print (tmp)
C3 C4 C5 Start End C8
C1 C2
A 1 - - - 12 14 -
2 - - - 1,4,7 3,6,10 -
3 - - - 16,19 17,21 -
4 - - - 22 24 -
tmp.reset_index(inplace=True)
print (tmp)
C1 C2 C3 C4 C5 Start End C8
0 A 1 - - - 12 14 -
1 A 2 - - - 1,4,7 3,6,10 -
2 A 3 - - - 16,19 17,21 -
3 A 4 - - - 22 24 -
我连接扩展的 'Start'
和 'End'
列以确保它们匹配,即使它们没有相同数量的条目。
s = tmp.Start.str.split(',', expand=True).stack().rename('Start')
e = tmp.End.str.split(',', expand=True).stack().rename('End')
se = pd.concat([s, e], axis=1).reset_index(1, drop=True)
tmp.drop(['Start', 'End'], axis=1).merge(se, left_index=True, right_index=True)
这是我的数据框(有更多的字母,长度约为 35.5k)以及 – 是其他相关字符串的内容)。所有变量都是字符串,['C1','C2'] 是 MultiIndex.
tmp
C1 C2 C3 C4 C5 Start End C8
A 1 - - - 12 14 -
A 2 - - - 1,4,7 3,6,10 -
A 3 - - - 16,19 17,21 -
A 4 - - - 22 24 -
我需要它变成这样(拆分包含逗号的每一行以维护其他所有内容):
C1 C2 C3 C4 C5 Start End C8 Appearance
A 1 - - - 12 14 - 1
A 2 - - - 1 3 - 1
A 2 - - - 4 6 - 2
A 2 - - - 7 10 - 3
A 3 - - - 16 17 - 1
A 3 - - - 19 21 - 2
A 4 - - - 22 24 - 1
我试过这个脚本 pandas: How do I split text in a column into multiple rows?
作为
s = tmp['Start'].str.split(',').apply(Series, 1).stack()
s.index = s.index.droplevel(-1)
s.name = 'Start
del tmp['Start']
final = tmp.join(s)
但是结果比它应该的要大得多!我得到了数千次重复,这只是试图拆分 'Start'。我什至无法想象尝试对 Start 和 End 都这样做('Start' 中的每个逗号都表示 'End'.
中的逗号Lengths:
tmp = 35568
s = 35676
final = 293408
您可以从 s1
和 s2
创建新的 df
,然后 join
. Also better is use parameter expand=True
in str.split
and delete multiple columns by drop
:
要创建列 Appearance
,请使用 groupby
by index
和 cumcount
。
s1 = tmp['Start'].str.split(',', expand=True).stack()
s1.index = s1.index.droplevel(-1)
s1.name = 'Start'
s2 = tmp['End'].str.split(',', expand=True).stack()
s2.index = s2.index.droplevel(-1)
s2.name = 'End'
tmp.drop(['Start', 'End'], inplace=True, axis=1)
df = pd.DataFrame({'s1':s1, 's2':s2}, index=s1.index)
final = tmp.join(df)
final['Appearance'] = final.groupby(final.index).cumcount() + 1
print (final)
C1 C2 C3 C4 C5 C8 s1 s2 Appearance
0 A 1 - - - - 12 14 1
1 A 2 - - - - 1 3 1
1 A 2 - - - - 4 6 2
1 A 2 - - - - 7 10 3
2 A 3 - - - - 16 17 1
2 A 3 - - - - 19 21 2
3 A 4 - - - - 22 24 1
通过评论编辑:
你可以先试试reset_index
:
print (tmp)
C3 C4 C5 Start End C8
C1 C2
A 1 - - - 12 14 -
2 - - - 1,4,7 3,6,10 -
3 - - - 16,19 17,21 -
4 - - - 22 24 -
tmp.reset_index(inplace=True)
print (tmp)
C1 C2 C3 C4 C5 Start End C8
0 A 1 - - - 12 14 -
1 A 2 - - - 1,4,7 3,6,10 -
2 A 3 - - - 16,19 17,21 -
3 A 4 - - - 22 24 -
我连接扩展的 'Start'
和 'End'
列以确保它们匹配,即使它们没有相同数量的条目。
s = tmp.Start.str.split(',', expand=True).stack().rename('Start')
e = tmp.End.str.split(',', expand=True).stack().rename('End')
se = pd.concat([s, e], axis=1).reset_index(1, drop=True)
tmp.drop(['Start', 'End'], axis=1).merge(se, left_index=True, right_index=True)