如何从保持列表顺序的列表向数据帧添加列

2024-04-27 04:50:52 发布

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

我有一个列表a=[‘苹果’、‘橘子’、‘芒果’]

我有一个这样的数据框

APPLE APPLE Orange Orange Mango Mango

x.     y.      x.     y.    x.    y.  

1      2       3      3      4     2
:      :       :      :      :     :

我想对其进行更改,在每第二行之后添加另一个名为FROUT的列,使数据帧如下所示:

APPLE APPLE Fruit  Orange Orange Fruit Mango Mango. Fruit

x.     y.    APPLE   x.     y.   Orange x.    y.  Mango

1      2    APPLE    3      3   Orange    4     2   Mango
:      :    APPLE    :      :      :     :          Mango

Tags: 数据苹果apple列表fruitorangemango芒果
2条回答

无论水果的数量或每个水果的列数如何,都可以动态地实现这一点。只需创建一个系列,它将返回列索引,我们应该在哪个位置.insert列以及水果的名称

  1. 您必须找到与value_counts()相同的列名的数量,然后[df.columns.unique()]就在那里,这样您就可以保持顺序(否则value_counts将进行排序,这将在不正确的位置添加列)

  2. 然后,添加1,因为您将在每个重复的水果名称后插入一列(这将使每组的列数增加1)

  3. 接下来,取累积和减去1,这将为您提供添加列所需的位置

  4. 最后,循环通过srs(使用insert添加列的位置),并同时循环通过fruitzip

这是srs的外观,也是您动态添加列的循环:

APPLE     2
Orange    5
Mango     8

# df.columns = ['APPLE', 'APPLE', 'Orange', 'Orange', 'Mango', 'Mango']
srs = (df.columns.value_counts()[df.columns.unique()] + 1).cumsum() - 1
fruit = srs.index
for f, i in zip(fruit, srs):
    df.insert(i,f'Fruit{i}',f)
df.columns = df.columns.str.replace('\d+','')
df
Out[1]: 
  APPLE APPLE  Fruit Orange Orange   Fruit Mango Mango  Fruit
0    x.    y.  APPLE     x.     y.  Orange    x.    y.  Mango
1     1     2  APPLE      3      3  Orange     4     2  Mango
2     :     :  APPLE      :      :  Orange     :     :  Mango

这远不是最好的解决方案,但它是有效的

import pandas as pd

def add_fruit(df, fruits):
  new_df = pd.DataFrame()
  for fruit in fruits:
    df_copy = df[fruit].copy()
    df_copy["Fruit"] = [fruit] * len(df.index)
    if new_df.empty:
      new_df = df_copy
    else:
      new_df = pd.concat([new_df, df_copy], axis=1, join='inner')
  return new_df

fruits = ['APPLE', 'Orange','Mango']

df = pd.DataFrame([['x', 'y', 'x', 'y', 'x', 'y'], [1, 2, 3, 3, 4, 2], [7,8,9,10,11,12]], columns = ['APPLE','APPLE','Orange','Orange','Mango','Mango'])

print(add_fruit(df, fruits))

相关问题 更多 >