pandas 为列赋值并在第n行后重置

pgccezyw  于 2022-11-27  发布在  其他
关注(0)|答案(3)|浏览(107)

我有一个Pandas数据框,看起来像这样...
| 索引|我的列(_C)|
| - -|- -|
| 第0页||
| 一个||
| 2个||
| 三个||
| 四个||
| 五个||
| 六个||
我需要做的是根据索引有条件地为'my_column'赋值。前三行的值应为'dog'、'cat'、'bird'。然后,接下来的三行也应为'dog'、'cat'、'bird'。该模式应一直应用到数据集的结尾。
| 索引|我的列(_C)|
| - -|- -|
| 第0页|挡块|
| 一个|猫|
| 2个|鸟|
| 三个|挡块|
| 四个|猫|
| 五个|鸟|
| 六个|挡块|
我已经尝试了以下代码无效。

for index, row in df.iterrows():
    counter=3
    my_column='dog'
    if counter>3
    break
    else 
    counter+=1
    my_column='cat'
    counter+=1
    if counter>3
    break
    else 
    counter+=1
    my_column='bird'
    if counter>3
    break
5vf7fwbs

5vf7fwbs1#

创建词典:

pet_dict = {0:'dog',
            1:'cat',
            2:'bird'}

您可以使用.name和modulus(%)函数乘以3来取得索引值,以取得您想要的结果:

df.apply (lambda x: pet_dict[x.name%3],axis=1)
0     dog
1     cat
2    bird
3     dog
4     cat
5    bird
6     dog
7     cat
8    bird
9     dog
thtygnil

thtygnil2#

几个问题:

  1. if语法不正确,缺少冒号和正确的缩进
    1.您正在break退出循环,提前终止循环,而不是使用ifelifelse结构
    1.您尝试在迭代 Dataframe 时更新 Dataframe 。
    请参阅this question,了解为什么在迭代时不应该更新。
    相反,您可以
values = ["dog", "cat", "bird"]

num_values = len(values)

for index in df.index():
    df.at[index, "my_column"] = values[index % num_values]
utugiqy6

utugiqy63#

高级索引

一种解决方案是将dog-cat-bird转换为pd.Series并使用高级索引:

dcb = pd.Series(["dog", "cat", "bird"])

df["my_column"] = dcb[df.index % len(dcb)].reset_index(drop=True)

首先从df.index % len(dcb)创建一个索引数组:

In [8]: df.index % len(dcb)
Out[8]: Int64Index([0, 1, 2, 0, 1, 2, 0], dtype='int64')

然后,通过使用高级索引,您可以使用该索引数组从dcb中选择元素:

In [9]: dcb[df.index % len(dcb)]
Out[9]:
0     dog
1     cat
2    bird
0     dog
1     cat
2    bird
0     dog
dtype: object

最后,注意上面数组的索引重复,重置它,用.reset_index(drop=True)删除旧索引,最后赋值给 Dataframe 。

使用发电机

下面是一个使用无限dog-cat-bird生成器的替代解决方案:

In [2]: df
Out[2]:
  my_column
0
1
2
3
4
5
6

In [3]: def dog_cat_bird():
   ...:     while True:
   ...:         yield from ("dog", "cat", "bird")
   ...:

In [4]: dcb = dog_cat_bird()

In [5]: df["my_column"].apply(lambda _: next(dcb))
Out[5]:
0     dog
1     cat
2    bird
3     dog
4     cat
5    bird
6     dog
Name: my_column, dtype: object

相关问题