单个DataFrame中多行的交集

时间:2019-06-02 10:00:15

标签: python python-2.7 dataframe

我有一个温度为1000的行(时间序列数据)和40列(集水区中的40点)的DataFrame。此DataFrame中的条目为零和1(1表示流域的活动部分,零表示非活动部分)。我想将多个相交值放置在同一DataFrame的单独列(名为inter)中。

我希望以这种方式输出[附加图像]

    inter的第一行中的
  • 值应为零,因为所有条目均为零 并且第一天没有活动

  • inter的第二行中的
  • 值应为4,因为有四个部分处于活动状态 在第2天。

  • inter的第三行中的
  • 值应为3(相交值的数量 以上所有行,包括第三行)[在此处输入图像描述] [1]。 图片中的绿色框显示了第三行的值

  • inter的第4行中的
  • 值应为的相交值数 以上所有行(图像中的黄色阴影区域)。

  • 类似,蓝色框显示第5行的值,红色框显示 第六行的值,依此类推

注意:对于每一行,我都会计算以上所有行的交点

Here is Expected Output

1 个答案:

答案 0 :(得分:0)

为此,我应该得到回报:) 这是你的答案:

import pandas as pd
import numpy as np

# setup test data
data = {'0': [0, 0, 0, 1, 0], '1': [0, 0, 1, 0, 1], '2': [0, 0, 0, 1, 0], '3': [0, 0, 1, 1, 1], '4': [0, 1, 1, 1, 0]
, '5': [0, 0, 0, 0, 1], '6': [0, 1, 1, 1, 0], '7': [0, 0, 1, 0, 1], '8': [0, 1, 0, 1, 0], '9': [0, 1, 1, 0, 0],
    '10': [0, 0, 1, 0, 0], '11': [0, 0, 0, 1, 1], '12': [0, 0, 0, 1, 1]}
data = pd.DataFrame(data=data)

# collect inter data
inter_data = []
for main_index, main_row in data.iterrows():

    # select data for calculations
    selected_data = data.loc[0:main_index,:]

    # handle firs row with 0 values
    if not 1 in main_row.values:
        inter_data.append(0)
    else:
        # handle second row
        if selected_data.shape[0] == 2:
          inter_data.append(selected_data[1:2].values[0].sum())
        # handle rest of data
        else:
            # drop last row from selected data
            selected_data = selected_data[:-1]
            # sum selected data
            summed_data = 0
            for index, row in selected_data.iterrows():
                summed_data += row.values

            # get position of 1
            positions = np.where(main_row.values == 1)
            # get summed data based on position
            positions_data = summed_data[positions[0]]
            # sum occurance in data
            inter_data.append((positions_data >= 1).sum())

# add inter data to raw data
data['inter'] = pd.DataFrame(inter_data)

输出:

   0  1  2  3  4  5  6  7  8  9  10  11  12  inder
0  0  0  0  0  0  0  0  0  0  0   0   0   0      0
1  0  0  0  0  1  0  1  0  1  1   0   0   0      4
2  0  1  0  1  1  0  1  1  0  1   1   0   0      3
3  1  0  1  1  1  0  1  0  1  0   0   1   1      4
4  0  1  0  1  0  1  0  1  0  0   0   1   1      5