如何使用Python根据动态条件分离数据帧的行

如何使用Python根据动态条件分离数据帧的行,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,奇怪的问题我似乎无法理解,我知道有更好的方法来看待它,我只是被卡住了。我需要根据类型获取这些数据的块。1到4在一个集合中一起,所以我想要例如,第0到8行,然后是第9行。每个集合将作为一个条目输入数据库 num date type signed 0 294981 2015-05-01 1 None 1 299888 2015-05-22 2 2015-05-28 2 299891 2015-05-22

奇怪的问题我似乎无法理解,我知道有更好的方法来看待它,我只是被卡住了。我需要根据类型获取这些数据的块。1到4在一个集合中一起,所以我想要例如,第0到8行,然后是第9行。每个集合将作为一个条目输入数据库

     num          date   type      signed
0   294981  2015-05-01      1        None
1   299888  2015-05-22      2  2015-05-28
2   299891  2015-05-22      2  2015-05-28
3   316150  2015-07-14      3  2015-07-23
4   336930  2015-10-13      3  2015-10-16
5   357536  2015-12-29      3  2015-12-29
6   379224  2016-03-14      3  2016-03-18
7   403862  2016-06-10      3  2016-06-10
8   414282  2016-07-26      4  2016-08-03
9   439184  2016-11-10      1  2016-11-14
10  448972  2016-12-12      2  2016-12-14
11  464306  2017-02-02      3  2017-02-06
事实上,这些数据不是静态的,有些集合可能有10行类型为3、1或4的数据。因此,如果我有以下几点:

     num          date   type      signed
0   294981  2015-05-01      2        None
1   299888  2015-05-22      2  2015-05-28
2   299891  2015-05-22      2  2015-05-28
3   316150  2015-07-14      3  2015-07-23
4   336930  2015-10-13      3  2015-10-16
5   357536  2015-12-29      3  2015-12-29
6   379224  2016-03-14      1  2016-03-18
7   403862  2016-06-10      3  2016-06-10
8   414282  2016-07-26      3  2016-08-03
9   439184  2016-11-10      4  2016-11-14
10  448972  2016-12-12      1  2016-12-14
11  464306  2017-02-02      2  2017-02-06
我需要出去:

     num          date   type      signed
0   294981  2015-05-01      2        None
1   299888  2015-05-22      2  2015-05-28
2   299891  2015-05-22      2  2015-05-28
3   316150  2015-07-14      3  2015-07-23
4   336930  2015-10-13      3  2015-10-16
5   357536  2015-12-29      3  2015-12-29

     num          date   type      signed
6   379224  2016-03-14      1  2016-03-18
7   403862  2016-06-10      3  2016-06-10
8   414282  2016-07-26      3  2016-08-03
9   439184  2016-11-10      4  2016-11-14

     num          date   type      signed
10  448972  2016-12-12      1  2016-12-14
11  464306  2017-02-02      2  2017-02-06
不幸的是,除了那个愚蠢的类型值之外,没有其他方法可以对这些数据进行分组。我对Pandas很在行,我找不到一种方法来做这件事,如果不告诉Python要获取哪些值,我也想不出其他方法来做这件事,当然,如果不查看数据,我不知道要获取哪些值


非常感谢你的帮助!(顺便说一句,我在标题中提到“动态条件”,因为类型列的值不是1-4、2-4或1-3或我可以设置的任何值。它将根据当时生成的数据而变化)

作为观察,我看到您的“类型”看起来像是按年份分组的。如果是这样的话,这样的事情可能对你有用:

getYear=λx:x.年
data.year=data.date.apply(getYear)

myGroup=data.groupby(year)

我假设您能够区分这些集合,因为下一个集合的类型将小于前一个集合的类型

您可以添加一个额外的临时列,用于添加分离数据帧的序列号。大概是这样的:

def separate_df(t):
   res = pd.Series()
   previous_df_no = 0
   for (index, value) in t.iteritems():
       if index==0:
           res.set_value(index,0)
       else:
           if value<t.loc[index-1]:
               previous_df_no += 1
           res.set_value(index,previous_df_no)
   return res
df['temp'] = separate_df(df.type)
def单独的df(t):
res=pd.Series()
上一个_df_no=0
对于t.iteritems()中的(索引、值):
如果索引==0:
res.set_值(索引,0)
其他:

如果value假设您希望在类型低于前一行中的类型后重新启动组,则此代码应起作用:

class Group():
    start = 0
    last_type = 0
    def four_group(self,x):
        if x < Group.last_type:
            Group.start +=1
        groupNum = Group.start
        Group.last_type = x
        return groupNum


df =  pd.read_csv("chart.csv")
zzz = Group()
df['TempGroup'] = df.type.apply(lambda x:zzz.four_group(x))
代码返回:

       num        date  type      signed  TempGroup
0   294981    5/1/2015     2        None          0
1   299888   5/22/2015     2   5/28/2015          0
2   299891   5/22/2015     2   5/28/2015          0
3   316150   7/14/2015     3   7/23/2015          0
4   336930  10/13/2015     3  10/16/2015          0
5   357536  12/29/2015     3  12/29/2015          0
6   379224   3/14/2016     1   3/18/2016          1
7   403862   6/10/2016     3   6/10/2016          1
8   414282   7/26/2016     3    8/3/2016          1
9   439184  11/10/2016     4  11/14/2016          1
10  448972  12/12/2016     1  12/14/2016          2
11  464306    2/2/2017     2    2/6/2017          2
然后可以基于TempGroup拆分数据帧,然后删除TempGroup列


编辑:混合数据帧

我有一个类似的问题,但情况不同。可能对其他人有用。我想在我的“tvshow”列是数字21的情况下分隔行。因此,每次我在列中找到21,我都会重置df['TempGroup']计数。 数据集摘要:

tvshow,time,duration
15,9.4,7.1
0,10.1,0.6
3,10.7,0.5
代码:


你能把你的问题说得更清楚些吗?我已经读了三遍了,我仍然不知道你要什么。@jimmy-c对此我很抱歉!我添加了一点,以便您可以看到数据需要如何分组。它需要分为1-4组(日期顺序不改变)。一旦我有了数据,我会为其他东西取第一个、最后一个和中间值。我需要显示每个1-4集的开始、结束和中间阶段。我希望这是有道理的,我快发疯了。对不起,如果看起来是这样,这绝对是这个样本的巧合。所有1-4套都跨越多年。Priya非常感谢!我决定使用基于类的答案,但仍然使用类似的逻辑。
tvshow,time,duration
15,9.4,7.1
0,10.1,0.6
3,10.7,0.5
class Group():
    start = 0
    last_type = 0
    Group.start = 0
    def four_group(self,x):
        if x == 21:
            Group.start = 0
        else: Group.start += 1
        groupNum = Group.start
        Group.last_type = x
        return groupNum
# Read from .csv
df = pd.read_csv('/home/dataset.csv')
grp = Group()
df['TempGroup'] = df.tvshow.apply(lambda x:grp.four_group(x))