【问题标题】:How to add column to a dataframe from a list preserving the order of the list如何从保留列表顺序的列表中将列添加到数据框
【发布时间】:2021-02-09 05:01:11
【问题描述】:

我有一个列表 A= ['APPLE', 'Orange','Mango']

我有一个这样的数据框

APPLE APPLE Orange Orange Mango Mango

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

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

我想改变它,在每两行之后添加另一个名为fruit的列,使数据框看起来像这样:

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

【问题讨论】:

  • @MartinGustafsson 好吧,我有一个不同列的列名相同的数据框
  • @MartinGustafsson 这不是真的,但这取决于列的创建方式。例如,您可以毫无错误地执行此操作:df.columns = ['APPLE', 'APPLE', 'Orange', 'Orange', 'Mango', 'Mango']。使用字典方法重命名列时会遇到问题,所以这又取决于它是如何完成的。
  • @DavidErickson 感谢您的确认。您知道该怎么做吗?
  • @DavidErickson 感谢您的解释,刚刚了解到。
  • @DavidErickson 非常感谢您的解决方案。我使用了堆栈/取消堆栈,然后使用列来获取新的数据框。

标签: python pandas list dataframe csv


【解决方案1】:

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

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

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-24
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多