将每个值分配给dataFrame上的范围

时间:2016-06-20 20:58:52

标签: python pandas dataframe

我有一个像这样的数组<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

但我需要更快更有效的方法来处理更大的数据框架,任何想法?

2 个答案:

答案 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