我有一个熊猫数据框,看起来像这样:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'date': [20130101,20130102, 20130103, 20130104, 20130105, 20130106],
'part1':[-0.17,-1.03,1.59,-0.05,-0.1,0.9],
'part2':[0.67,-0.03,1.95,-3.25,-0.3,0.6],
'part3':[0.7,-3,1.5,-0.25,-0.37,0.62],
'part4':[0.24,-0.44,1.335,-0.45,-0.57,0.92]
})
df2 = pd.DataFrame({
'date': [20130101,20130102, 20130103, 20130104, 20130105, 20130106],
'ranking': [3, 4, 1, 4, 2, 3]
})
date output ranking
0 20130101 0.24 3
1 20130102 -3.00 4
2 20130103 1.95 1
3 20130104 -3.25 4
4 20130105 -0.30 2
5 20130106 0.62 3
您可能会注意到,在最后一列中,其模式为零和一。 可以将这个数据帧分成两个子数据帧吗?
我想要的输出将是:
df1:
v1 v2 v3 result
0 12 31 31 0
1 34 52 4 1
2 32 4 5 1
3 7 89 2 0
4 5 17 8 1
5 11 25 23 1
6 2 32 34 1
7 0 1 3 0
df2:
v1 v2 v3 result
0 34 52 4 1
1 32 4 5 1
0 5 17 8 1
1 11 25 23 1
2 2 32 34 1
绝对不起作用,因为它只会创建两个大数据框;一个加一,第二个加零。我对将数据标记为零不感兴趣。
谢谢!
PS。 实际上,此数据帧要大得多,所以我尝试创建df1,df2,... dfn
答案 0 :(得分:0)
您可以创建dictionary of DataFrames
:
mask = df['result'].eq(1)
a = pd.factorize(df['result'].eq(0).cumsum()[mask])[0]
dfs = dict(tuple(df[mask].groupby(a)))
print (dfs[0])
v1 v2 v3 result
1 34 52 4 1
2 32 4 5 1
print (dfs[1])
v1 v2 v3 result
4 5 17 8 1
5 11 25 23 1
6 2 32 34 1
详细信息:
创建布尔掩码以通过eq
(==
)进行过滤:
mask = df['result'].eq(1)
print (mask)
0 False
1 True
2 True
3 False
4 True
5 True
6 True
7 False
Name: result, dtype: bool
通过与Series
和Series.cumsum
进行比较来创建计数器0
:
print (df['result'].eq(0).cumsum())
0 1
1 1
2 1
3 2
4 2
5 2
6 2
7 3
Name: result, dtype: int32
仅按1
行boolean indexing
进行过滤:
print (df['result'].eq(0).cumsum()[mask])
1 1
2 1
4 2
5 2
6 2
Name: result, dtype: int32
为0
中的字符串添加factorize
:
a = pd.factorize(df['result'].eq(0).cumsum()[mask])[0]
print (a)
[0 0 1 1 1]
从groupby
对象创建字典,但也通过布尔掩码过滤行:
dfs = dict(tuple(df[mask].groupby(a)))
print (dfs)
{0: v1 v2 v3 result
1 34 52 4 1
2 32 4 5 1, 1: v1 v2 v3 result
4 5 17 8 1
5 11 25 23 1
6 2 32 34 1}
答案 1 :(得分:0)
使用 numpy.split
:
s = df.loc[df.result.eq(1)]
idx = np.where(np.diff(s.index)!=1)[0] + 1
for d in np.split(s, idx):
print(d, end='\n\n')
v1 v2 v3 result
1 34 52 4 1
2 32 4 5 1
v1 v2 v3 result
4 5 17 8 1
5 11 25 23 1
6 2 32 34 1