数据框,若值在范围内则求和
我有点迷茫,不知道该怎么继续了。基本上,我有两个数据框(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
- 创建区间 -
interval_ranges = [df['A'].iloc[0]] + df['B'].tolist()
这行代码的意思是从数据框(df)中取出'A'列的第一个值,然后把'B'列的所有值放在一起,形成一个区间列表。 - 在两个数据框中创建连接的列,使用
pd.cut(df['B'], interval_ranges)
和pd.cut(df2['Point'], interval_ranges)
。这一步是把'B'列和另一个数据框中的'Point'列根据之前创建的区间进行分类。 - 根据这个连接的列把两个数据框合并在一起。
- 创建一个新的
Returned_Data
列,通过把A
列和B
列的值相加来实现。 - 可选地,使用
.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