![](/img/trans.png)
[英]Split a Pandas dataframe into multiple dataframes based on the value of a column
[英]How to split/slice a Pandas dataframe into multiple dataframes by column value?
我有以下熊猫 DF:
0 | A
1 | B
2 | A
3 | A
4 | B
5 | A
6 | B
7 | B
8 | A
9 | A
我想将这个单个 DF 沿 B 值分割成多个,这样我就省略了所有 B 并将所有连续的 A 行作为相应的结果 DF,如下所示:
df#1:
0 | A
df#2:
2 | A
3 | A
df#3:
5 | A
df#4:
8 | A
9 | A
必须保持 A 行的顺序。 如何执行此操作? (实际任务是相关事件的时间序列,必须作为一个事件处理,由不相关事件分隔。)
您可以使用itertools.groupby
过滤掉您想要的部分 -
from itertools import groupby
dfs = [pd.DataFrame.from_records(list(g),
columns=df.reset_index().columns, index='index')
for k, g in
groupby(df.to_records(), key=lambda x: x[2])
if k.strip() == 'A']
df_1, df_2, df_3, df_4 = dfs #This is probably not necessary
输出
# df_1
0 1
index
0 0 A
# df_2
0 1
index
2 2 A
3 3 A
您可以通过掩码创建的连续A
值创建循环,以便将列col
与链掩码创建的组进行比较,并使用累积sum
移位反转值:
m = df.col.eq('A')
for i, g in df[m].groupby((m & ~m.shift(fill_value=False)).cumsum()):
print (g)
col
0 A
col
2 A
3 A
col
5 A
col
8 A
9 A
或 DataFrames 的字典:
m = df.col.eq('A')
d = {i: g for i, g in df[m].groupby((m & ~m.shift(fill_value=False)).cumsum())}
print (d)
{1: col
0 A, 2: col
2 A
3 A, 3: col
5 A, 4: col
8 A
9 A}
print (d[1])
col
0 A
另一个类似的想法:
m = df.col.eq('A')
d = {i: g for i, g in df[m].groupby(m.ne(m.shift()).cumsum())}
print (d)
{1: col
0 A, 3: col
2 A
3 A, 5: col
5 A, 7: col
8 A
9 A}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.