[英]Adding a new column to a dataframe from the values of another dataframe based on a condition
[英]Adding new data to a Dataframe from another Dataframe based on condition
所以我的问题是如何根据另一个 dataframe 的条件将新列中的数据添加到 dataframe。这很难说,所以我在这里举个例子
df1
columns a b c
0 10 1
10 15 3
15 20 5
df2
columns d e
3.3 10
5.5 20
14.5 11
17.2 5
我想在这里做的是将另一列 f 添加到 df2,它的值来自 df1 这样如果 d[i] 在 a[j] 和 b[j] 之间,则将值 c[j] 复制到df2 中的新列 f[i]。 例如:d[1] = 5.5 所以 0< 5.5< 10 因此,f[1] 的值 = c[0] = 1
最终结果应该是这样的
df2
columns d e f
3.3 10 1
5.5 20 1
14.5 11 3
17.2 5 5
任何帮助是极大的赞赏!
问候,
史蒂夫
假设df1
a 和 b 中的间隔不重叠,您可以将pd.cut
与pd.IntervalIndex
一起使用:
import pandas as pd
# Your dfs here
df1 = pd.read_clipboard()
df2 = pd.read_clipboard()
idx = pd.IntervalIndex.from_arrays(df1["a"], df1["b"])
mapping = df1["c"].set_axis(idx)
df2["f"] = pd.cut(df2["d"], idx).map(mapping)
df2:
d e f
0 3.3 10 1
1 5.5 20 1
2 14.5 11 3
3 17.2 5 5
如果您没有重叠间隔,则pd.IntervalIndex
接受的解决方案非常适合。
另一种选择是使用pyjanitor中的conditional_join ,它也可以处理重叠间隔:
# pip install pyjanitor
import pandas as pd
import janitor
(df2
.conditional_join(
# types have to be same
# for columns to be compared
df1.astype({"a":float, "b":float}),
('d', 'a', '>='),
('d', 'b','<='),
# depending on the data size,
# numba may offer more performance
use_numba=False,
right_columns = {'c':'f'})
)
d e f
0 3.3 10 1
1 5.5 20 1
2 14.5 11 3
3 17.2 5 5
你可以使用:
result = []
for item in df2['d']:
for row in df1.iterrows():
if row[1]['a'] <= item <= row[1]['b']:
val = (row[1]['c'])
break
else:
val = None
result.append(val)
df2['f'] = result
print(df2)
import pandas as pd
df1 = pd.DataFrame({'a':[0,10,15],'b':[10,15,20],'c':[1,3,5]})
df2 = pd.DataFrame({'d':[3.3,5.5,9.5,17.2],'e':[10,20,11,5]})
df2['f']=0
for i in range(df2.shape[0]):
for j in range(df1.shape[0]):
if df2.d[i]>=df1.a[j] and df2.d[i]<=df1.b[j]:
df2.f[i]=df1.c[j]
df2
这个选项怎么样?
# merge the two dfs
df = pd.merge(df2, df1, left_on='d', right_on='b', how='left')
df2['f'] = None
df2['f'] = df.apply(lambda x: x['c'] if x['a_x'] <= x['d'] <= x['b_x'] else None, axis=1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.