gpt4 book ai didi

python - 如何选择 Pandas 中的行范围?

转载 作者:太空狗 更新时间:2023-10-29 21:48:21 25 4
gpt4 key购买 nike

我创建了一个具有一系列特征的数据框。我想创建一个新列来选择两个特定行(将作为输入)之间的所有行。

假设数据框如下:

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

df表:

enter image description here

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

我在创建该掩码时遇到了问题,因为货币是按字母顺序选择的:

mask = (df['currency'] >= 'Dollar') & (df['currency'] <= 'Pound')

以上创建了一个新列,其中包含所有货币的 T,“日元”除外。我明白为什么上面的失败了,但想不出一种方法来做我想做的事。

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

最佳答案

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

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

唯一索引的替代工​​作:

a = df['currency'].eq('Dollar').idxmax()
b = df['currency'].eq('Pound').iloc[::-1].idxmax()
df['new'] = 0
df.loc[a:b, 'new'] = 1

print (df)
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

解释:

  1. 比较 Series.eq== first
  2. 有什么区别
  3. 获取cumsum
  4. 对于第二个条件反向掩码 [::-1]
  5. 乘以mul并用 clip_upper 将非 0 替换为 1

第二种解决方案使用idxmax对于第一个索引值并通过 loc

设置 1

关于python - 如何选择 Pandas 中的行范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49871101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com