![](/img/trans.png)
[英]Fill columns with values from other dataframe with corresponding id in pandas
[英]Pandas. Matching values with corresponding ranges from other DataFrame
我有两个数据框。
第一个包含用户 ID 和他们的分数(分数列)。 另一个数据框包含一些阈值和范围名称。
如果点列中的值介于“下”和“上”阈值之间,我需要在第一个 df 中创建一个新列,该列将是第二个 df 的范围。
我尝试使用以下代码:
def r(points):
r = thresholds #thresholds is the df from my second screenshot
if r['lower'] <= points < r['upper']:
r['range']
return r['range']
PointsEarned['range'] = PointsEarned.points.map(r)
但是我收到一个错误
ValueError:系列的真值不明确。 使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
我想我需要在这里使用一些循环来迭代阈值数据帧。
任何有关如何创建新的“范围”列的帮助将不胜感激
使用pandas.cut
和仓从创建upper
柱,用插入的第一值lower
列:
df = pd.DataFrame(data={'upper': [25,50,75,100,150,250],
'lower': [1,25, 50,75,100,150]})
PointsEarned = pd.DataFrame(data={'points': [32,6,80,113]})
bins = np.insert(df['upper'].values, 0, df['lower'].iat[0])
print (bins)
[ 1 25 50 75 100 150 250]
PointsEarned['range'] = pd.cut(PointsEarned.points, bins=bins, right=False)
print (PointsEarned)
points range
0 32 [25, 50)
1 6 [1, 25)
2 80 [75, 100)
3 113 [100, 150)
另一种解决方案。 这可能会帮助其他人。 您实际上可以在 sqlite 中构建表并使用连接来匹配范围。
import sqlite3
import sqlalchemy.pool
sqlite = sqlalchemy.pool.manage(sqlite3, poolclass=sqlalchemy.pool.SingletonThreadPool)
conn = sqlite3.connect(":memory:")
A = pd.DataFrame(data={'points': [32,6,80,113,57,48,5,28,10,11,29,125]})
B = pd.DataFrame(data={'lower': [1,25, 50,75,100,150],
'upper': [25,50,75,100,150,250],
'range': ['[1,25]','[25,50]', '[50,75]','[75,100]','[100,150]','[150,250]']})
A.to_sql("A", conn, index=False)
B.to_sql("B", conn, index=False)
qry = "SELECT points, lower, upper, range FROM A left join B on A.points between B.lower and B.upper"
tt = pd.read_sql_query(qry,conn)
print tt
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.