Python 熊猫:将数据帧列拆分为单独的行
基于此,我希望基于列Python 熊猫:将数据帧列拆分为单独的行,python,pandas,Python,Pandas,基于此,我希望基于列var1拆分数据帧。但是,我在字母之间没有分隔符 import pandas as pd a = pd.DataFrame([{'var1': 'abc', 'var2': 1}, {'var1': 'def', 'var2': 2}]) b = pd.DataFrame([{'var1': 'a', 'var2': 1}, {'var1': 'b', 'var2': 1},
var1
拆分数据帧。但是,我在字母之间没有分隔符
import pandas as pd
a = pd.DataFrame([{'var1': 'abc', 'var2': 1},
{'var1': 'def', 'var2': 2}])
b = pd.DataFrame([{'var1': 'a', 'var2': 1},
{'var1': 'b', 'var2': 1},
{'var1': 'c', 'var2': 1},
{'var1': 'd', 'var2': 2},
{'var1': 'e', 'var2': 2},
{'var1': 'f', 'var2': 2}])
这就是我想要实现的目标
>>> a
var1 var2
0 abc 1
1 def 2
>>> b
var1 var2
0 a 1
1 b 1
2 c 1
3 d 2
4 e 2
5 f 2
.split()
对空字符(“”)不起作用
因此,上述方法不起作用。你知道我怎样才能做到吗?把这个字符串列成一个列表:
pd.concat([pd.Series(row['var2'], list(row['var1'])) for _, row in a.iterrows()]).reset_index()
如果绩效很重要,请使用列表理解:
df = pd.DataFrame([[x, j] for i, j in zip(a['var1'], a['var2']) for x in list(i)],
columns=a.columns)
print (df)
var1 var2
0 a 1
1 b 1
2 c 1
3 d 2
4 e 2
5 f 2
小数据帧中的性能:
In [215]: %timeit pd.DataFrame([[x, j] for i, j in zip(a['var1'], a['var2']) for x in list(i)], columns=a.columns)
355 µs ± 4.08 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [216]: %timeit pd.concat([pd.Series(row['var2'], list(row['var1'])) for _, row in a.iterrows()]).reset_index()
2.93 ms ± 203 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
编辑: 多列的通用解决方案:
a = pd.DataFrame([{'var1': 'abc', 'var2': 1, 'var3':7},
{'var1': 'def', 'var2': 2, 'var3':5}])
b = pd.DataFrame([(y, *x[1:]) for x in a.values.tolist() for y in list(x[0])],
columns=a.columns)
print (b)
var1 var2 var3
0 a 1 7
1 b 1 7
2 c 1 7
3 d 2 5
4 e 2 5
5 f 2 5
太好了,谢谢。如果我的数据框有两列以上(例如,
var1
,var2
,var3
,var4
),我将如何调整您的命令?@littlebird-给我一个sec@littlebird这是一个副本,请参阅,以获取您刚才所问问题的确切答案asked@littlebird-检查编辑的答案
#2k rows
a = pd.concat([a] * 1000, ignore_index=True)
In [217]: %timeit pd.DataFrame([[x, j] for i, j in zip(a['var1'], a['var2']) for x in list(i)], columns=a.columns)
2.82 ms ± 23.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [218]: %timeit pd.concat([pd.Series(row['var2'], list(row['var1'])) for _, row in a.iterrows()]).reset_index()
1.8 s ± 140 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
a = pd.DataFrame([{'var1': 'abc', 'var2': 1, 'var3':7},
{'var1': 'def', 'var2': 2, 'var3':5}])
b = pd.DataFrame([(y, *x[1:]) for x in a.values.tolist() for y in list(x[0])],
columns=a.columns)
print (b)
var1 var2 var3
0 a 1 7
1 b 1 7
2 c 1 7
3 d 2 5
4 e 2 5
5 f 2 5
#lower python versions
b = pd.DataFrame([(y,) + tuple(x[1:]) for x in a.values.tolist() for y in list(x[0])],
columns=a.columns)
print (b)
var1 var2 var3
0 a 1 7
1 b 1 7
2 c 1 7
3 d 2 5
4 e 2 5
5 f 2 5