如何使用周期值列拆分熊猫数据框

时间:2018-09-12 08:14:14

标签: python pandas dataframe

我有一个熊猫数据框,看起来像这样:

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

2 个答案:

答案 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

通过与SeriesSeries.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

仅按1boolean 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