如何选择Pandas的行范围?

2024-09-23 10:23:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经创建了一个具有许多特性的数据帧。我想创建一个新列,选择两个特定行之间的所有行(这些行将作为输入)。在

假设数据帧如下:

data = {'currency': ['Euro', 'Euro', 'Euro', 'Dollar', 'Dollar', 'Yen',
                     'Yen', 'Yen', 'Pound', 'Pound', 'Pound, 'Pesos',
                     'Pesos'], 
    'cost': [34, 67, 32, 29, 48, 123, 23, 45, 78, 86, 23, 45, 67]}
df = pd.DataFrame(data, columns = ['currency', 'cost'])
df

测向表:

enter image description here

我想添加一个新列,在满足条件时分配1。在我的例子中,条件是两种特定货币之间的所有行。例如,假设我想要“美元”和“英镑”之间的所有货币。我的猜测是我必须创建一个掩码并将其用作条件,即选择第一行“美元”行和最后一行“磅”行之间的所有行(即第3-10行)。在

不过,我在创建面具时遇到了一些问题,因为货币是按字母顺序选择的:

^{pr2}$

上面创建了一个新列,除了“日元”以外,所有货币都有T。我能理解为什么上面的方法失败了,但是我想不出一种方法来做我想做的事情。在

注:相同的货币名称将分组出现,例如“英镑”不能在第4-5行,然后在第8-10行。在


Tags: 数据方法dfdata货币特性条件currency
2条回答

同样适用于重复索引的一般解决方案:

a = df['currency'].eq('Dollar').cumsum()
b = df['currency'].eq('Pound').iloc[::-1].cumsum()
df['new'] = a.mul(b).clip_upper(1)

唯一索引的替代工作:

^{pr2}$

说明:

  1. 首先用^{}比较与==相同的内容
  2. 得到^{}
  3. 对于第二种情况,[::-1]反转掩模
  4. ^{}倍增,并将非0替换为1^{}

第二个解决方案使用^{}作为第一个索引值,并将1设置为loc

在逻辑或上使用Numpy的累加

cumor = np.logical_or.accumulate

c = df.currency.values
d = c == 'Dollar'
p = c == 'Pound'

df.assign(new=(cumor(d) & cumor(p[::-1])[::-1]).astype(np.uint))

   currency  cost  new
0      Euro    34    0
1      Euro    67    0
2      Euro    32    0
3    Dollar    29    1
4    Dollar    48    1
5       Yen   123    1
6       Yen    23    1
7       Yen    45    1
8     Pound    78    1
9     Pound    86    1
10    Pound    23    1
11    Pesos    45    0
12    Pesos    67    0

相关问题 更多 >