使用for循环根据多种条件下的旧数据帧创建新数据帧

时间:2019-12-27 22:44:42

标签: python dataframe for-loop

我是python的新手,正在尝试编写代码以根据旧数据框的条件以及新数据框上方单元格中的结果创建新数据框。

以下是我要执行的操作的一个示例:

  1. 是原始数据

  2. 我需要创建一个新的数据框,如果原始数据中的对应位置为0,则结果为0,如果大于0,则结果为1加上面的行

  3. 我需要删除所有连续间隔不小于3的实例

visualization

我对代码的看法是这样的,但是对于python来说,我很挣扎。

从原始数据到数据框2:

if (1,1)=0  then (1a, 1a)= 0: # line 1
    else (1a,1a)=1;

if (2,1)=0  then (2a,1a)=0; # line 2
     else (2a,1a)= (1a,1a)+1 = 2;

if (3,1)=0  then (3a,1a)=0; # line 3

从数据框2到3:

如果最后3行中的任何一行大于3,则返回该单元格的值,否则返回0

我不确定如何进行这些工作,如果有更简单的方法来做/思考这个问题,那么我在做什么,请告诉我。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

根据您的问题,我能够生成的输出为:

Earlier, the DataFrame looked like so:
       A  B   C
0.05   5  0   0
0.10   7  0   1
0.15   0  0  12
0.20   0  4   3
0.25   1  0   5
0.30  21  5   0
0.35   6  0   9
0.40  15  0   0

Now, the DataFrame looks like so:
      A  B  C
0.05  0  0  0
0.10  0  0  1
0.15  0  0  2
0.20  0  0  3
0.25  1  0  4
0.30  2  0  0
0.35  3  0  0
0.40  4  0  0

下面提供了我用于此目的的代码,只需将以下代码复制到一个新文件中,例如code.py并运行它

import re
import pandas as pd

def get_continous_runs(ext_list, threshold):
    mylist = list(ext_list)
    for i in range(len(mylist)):
        if mylist[i] != 0:
            mylist[i] = 1
    samp = "".join(map(str, mylist))
    finder = re.finditer(r"1{%s,}" % threshold, samp)
    ranges = [x.span() for x in finder]
    return ranges

def build_column(ranges, max_len):
    answer = [0]*max_len
    for r in ranges:
        start = r[0]
        run_len = r[1] - start
        for i in range(run_len):
            answer[start+i] = i + 1
    return answer

def main(df):
    print("Earlier, the DataFrame looked like so:")
    print(df)
    ndf = df.copy()
    for col_name, col_data in df.iteritems():
        ranges = get_continous_runs(col_data.values, 4)
        column_len = len(col_data.values)
        new_column = build_column(ranges, column_len)
        ndf[col_name] = new_column
    print("\nNow, the DataFrame looks like so:")
    print(ndf)
    return

if __name__ == '__main__':
    raw_data = [
        (5,0,0), (7,0,1), (0,0,12), (0,4,3),
        (1,0,5), (21,5,0), (6,0,9), (15,0,0),
    ]

    df = pd.DataFrame(
        raw_data,
        columns=list("ABC"),
        index=[0.05,0.10,0.15,0.20,0.25,0.30,0.35,0.40]
    )

    main(df)

您可以在第28行中调整阈值,以获取除4以外的连续间隔数(即大于3)。

与往常一样,首先阅读main()函数以了解一切的工作原理。我试图使用好的变量名来帮助理解。因为使用正则表达式,所以我的方法似乎有些人为,但是我不想让自定义游程计数器使一个初学者不知所措,所以...