Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从保持列表顺序的列表向数据帧添加列_Python_Pandas_List_Dataframe_Csv - Fatal编程技术网

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

Python 如何从保持列表顺序的列表向数据帧添加列,python,pandas,list,dataframe,csv,Python,Pandas,List,Dataframe,Csv,我有一个列表a=[‘苹果’、‘橘子’、‘芒果’] 我有一个这样的数据框 APPLE APPLE Orange Orange Mango Mango x. y. x. y. x. y. 1 2 3 3 4 2 : : : : : : 我想对其进行更改,在每第二行之后添加另一个名为FROUT的列,使数据帧如下所示: APPLE APPLE Fruit

我有一个列表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

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

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))

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

  • 您必须找到具有
    value\u counts()
    的相同列名的数量,然后
    [df.columns.unique()]
    就在那里,这样您就可以维持顺序(否则
    value\u counts
    将进行排序,这将在不正确的位置添加列)

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

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

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

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

    APPLE     2
    Orange    5
    Mango     8
    
    --


    @MartinGustafsson我有一个数据框,不同的数据框有相同的列名columns@MartinGustafsson事实并非如此,但这取决于列的创建方式。例如,您可以不出错地执行此操作:
    df.columns=['APPLE','APPLE','Orange','Orange','Mango','Mango']
    。使用dictionary方法重命名列时会遇到问题,因此这同样取决于操作方式。@DavidErickson感谢您的确认。您知道如何操作吗?@DavidErickson感谢您的解释,“我刚刚学到了这一点。@DavidErickson非常感谢您提供的解决方案。我使用stack/unstack,然后使用列来获取新的数据帧。
    # 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