【问题标题】:index counter for if conditions python pandasif条件python pandas的索引计数器
【发布时间】:2019-07-29 13:09:41
【问题描述】:

我想为我的数据帧生成某种循环。下面示例中的一个循环的长度为 4。最后一列是应该是什么样子,其余的是代表我的尝试。

我当前的代码如下所示:

import pandas as pd
import numpy as np

l = list(np.linspace(0,10,12))
data = [
        ('time',l),
         ('A',[0,5,0.6,-4.8,-0.3,4.9,0.2,-4.7,0.5,5,0.1,-4.6]),
         ('B',[ 0,300,20,-280,-25,290,30,-270,40,300,-10,-260]),
         ]
df = pd.DataFrame.from_dict(dict(data))
length = len(df)
df.loc[0,'cycle']=1
df['cycle'] = length/4 +df.loc[0,'cycle']
i = 0
for i in range(0,length):
    df.loc[i,'new_cycle']=i+1
df['want_cycle']=   [1,1,1,1,2,2,2,2,3,3,3,3]  
print(length)
print(df)

我确实需要代码中的 if 条件,如果索引计数器例如 4,也只会增加 df['new_cycle'] 的值。但到目前为止,我未能找到实现此类条件的正确方法。

【问题讨论】:

  • 抱歉@sulphur 我有点困惑,如果索引等于 4,您只想增加 new_cycle 中的计数?
  • 不抱歉只有4,因为你数到4然后增加i +1

标签: python pandas


【解决方案1】:

尝试使用默认范围索引,因为您的数据框行索引是从 0 开始的范围,数据框的默认索引,您可以使用下限来计算您的周期:

df['cycle'] = df.index//4 + 1

输出:

         time    A    B  cycle
0    0.000000  0.0    0      1
1    0.909091  5.0  300      1
2    1.818182  0.6   20      1
3    2.727273 -4.8 -280      1
4    3.636364 -0.3  -25      2
5    4.545455  4.9  290      2
6    5.454545  0.2   30      2
7    6.363636 -4.7 -270      2
8    7.272727  0.5   40      3
9    8.181818  5.0  300      3
10   9.090909  0.1  -10      3
11  10.000000 -4.6 -260      3

现在,如果您的数据框索引不是默认值,您可以使用如下内容:

df['cycle'] = [df.index.get_loc(i) // 4 + 1 for i in  df.index]

【讨论】:

    【解决方案2】:

    我只为你添加了 1 个东西,一个名为 new_cycle 的新变量,它将保留你所追求的计数。

    在 for 循环中,我们检查 i 是否可以被 4 整除而没有余数,如果是,我们将向新变量加 1,并用该值填充数据框就像你做的那样。

    import pandas as pd
    import numpy as np
    
    l = list(np.linspace(0,10,12))
    data = [
            ('time',l),
             ('A',[0,5,0.6,-4.8,-0.3,4.9,0.2,-4.7,0.5,5,0.1,-4.6]),
             ('B',[ 0,300,20,-280,-25,290,30,-270,40,300,-10,-260]),
             ]
    df = pd.DataFrame.from_dict(dict(data))
    length = len(df)
    df.loc[0,'cycle']=1
    df['cycle'] = length/4 +df.loc[0,'cycle']
    new_cycle = 0
    for i in range(0,length):
        if i % 4 == 0:
            new_cycle += 1
        df.loc[i,'new_cycle']= new_cycle
    df['want_cycle'] = [1,1,1,1,2,2,2,2,3,3,3,3]  
    print(length)
    print(df) 
    

    【讨论】:

    • 谢谢你的回答,我只是选择上面的答案,因为这似乎是解决我问题的更直接的方法。
    猜你喜欢
    • 1970-01-01
    • 2016-11-28
    • 2023-01-30
    • 2019-10-07
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    相关资源
    最近更新 更多