数据框,若值在范围内则求和

1 投票
5 回答
97 浏览
提问于 2025-04-14 15:28

我有点迷茫,不知道该怎么继续了。基本上,我有两个数据框(dataframe),是从csv文件中读取的。

data = {'A': [0,11,21,31,41,51,61],
        'B': [10,20,30,40,50,60,70]}

data2 = {'Point': [11.5, 18.3, 31.3, 41.2, 51.5, 66.6, 34.7, 12.1, 14.4, 56.8, 54.3]}

df = pd.DataFrame(data)
df2 = pd.DataFrame(data2)

我想做的是找出df2中的某个点是否在数据的A列和B列的范围内,并返回(A+B)的结果,然后把这个结果作为新的一列添加到df中。比如对于第一个点11.5,我应该得到11+20的结果,然后把这个值放到新的一列里。

所以最后的输出应该是这样的:

Point   :    Returned_Data
11.5             31
18.3             31
31.3             71
and so on

我遇到的问题是,如何在范围内合并或组合两个列数和行数不同的数据框。我知道怎么用np.where来匹配值,但对于上面的情况我该怎么做呢?我也试过用bin,但那样得到的是范围,而不是具体的值。

 range = [0,11,21,31,41,51,61]
 df['Returned_Data'] = pd.cut (x=check[list], bins =range)
    A   B Returned_Data
0   0  10       (0, 11]
1  11  20      (11, 21]
2  21  30      (21, 31]

任何帮助都非常感谢。谢谢。

5 个回答

0
  1. 创建区间 - interval_ranges = [df['A'].iloc[0]] + df['B'].tolist() 这行代码的意思是从数据框(df)中取出'A'列的第一个值,然后把'B'列的所有值放在一起,形成一个区间列表。
  2. 在两个数据框中创建连接的列,使用 pd.cut(df['B'], interval_ranges)pd.cut(df2['Point'], interval_ranges)。这一步是把'B'列和另一个数据框中的'Point'列根据之前创建的区间进行分类。
  3. 根据这个连接的列把两个数据框合并在一起。
  4. 创建一个新的 Returned_Data 列,通过把 A 列和 B 列的值相加来实现。
  5. 可选地,使用 .drop(columns=['interval', 'A', 'B']) 删除多余的列,这样可以让数据框看起来更简洁。
1

一种方法是找出每个 Point 值属于哪个区间,然后把这个区间的起始值和结束值加起来:

ranges = df2['Point'].apply(lambda v:np.argmax((df['A'] <= v) & (v <= df['B'])))
df2['Returned Data'] = df.loc[ranges, ['A', 'B']].sum(axis=1).values

输出结果:

    Point  Returned Data
0    11.5             31
1    18.3             31
2    31.3             71
3    41.2             91
4    51.5            111
5    66.6            131
6    34.7             71
7    12.1             31
8    14.4             31
9    56.8            111
10   54.3            111
3

使用IntervalIndex来创建一系列的区间,然后用reindex进行重新索引:

s = (df[['A', 'B']].sum(axis=1)
     .set_axis(pd.IntervalIndex.from_arrays(df['A'], df['B']))
     )

out = s.reindex(df2['Point']).reset_index(name='Returned Data')

输出结果:

    Point  Returned Data
0    11.5             31
1    18.3             31
2    31.3             71
3    41.2             91
4    51.5            111
5    66.6            131
6    34.7             71
7    12.1             31
8    14.4             31
9    56.8            111
10   54.3            111

撰写回答