我有一个像这样的数组<h2 id="anchor-name">
<a href="#any-anchor-link">
和像这样的数据框states
[(1,3), (3,5), (5,7), (7,9)]
我需要在df
上分配所属范围的索引才能得到类似这样的内容
l y
0 a 8
1 b 3
2 c 7
3 d 4
4 e 1
对于states
中的每个范围, l y state
0 a 8 3
1 b 3 0
2 c 7 2
3 d 4 1
4 e 1 0
值必须属于states
范围,但y
所属的第一个范围除外(start, end]
1
但我需要更快更有效的方法来处理更大的数据框架,任何想法?
答案 0 :(得分:0)
使用pandas.cut():
bins=pd.Series([1,3,5,7,9, np.inf])
df['state'] = pd.cut(df.y, bins=bins, labels=bins.index[:-1], include_lowest=True)
输出:
In [113]: df
Out[113]:
l y state
0 a 8 3
1 b 3 0
2 c 7 2
3 d 4 1
4 e 1 0
如何将states
元组列表转换为平面pd.Series
:
In [125]: states
Out[125]: [(1, 3), (3, 5), (5, 7), (7, 9)]
In [126]: bins = pd.Series(np.unique(list(sum(states, ()))))
In [127]: bins
Out[127]:
0 1
1 3
2 5
3 7
4 9
dtype: int32
In [128]: bins.tolist()
Out[128]: [1, 3, 5, 7, 9]
答案 1 :(得分:0)
要避免使用.apply()
循环遍历所有行,而是以矢量化方式分配states
:
df['states'] = 0
for i, state in enumerate(states):
df.loc[(df.y > state[0]) & (df.y <= state[1]), 'states'] = i
得到:
l y states
0 a 8 3
1 b 3 0
2 c 7 2
3 d 4 1
4 e 1 0