如何使用 for 循环将列值添加到数据框字典中,以便每个数据框都有一个唯一的列?

Posted

技术标签:

【中文标题】如何使用 for 循环将列值添加到数据框字典中,以便每个数据框都有一个唯一的列?【英文标题】:How to add a column value into dataframe dictionary using a for loop so that each dataframe gets a unique column? 【发布时间】:2018-09-16 16:18:16 【问题描述】:

我想将codes 添加到dataframe dictionary

 codes = [['01', '02', '03', '05', '06', '08', '10', '11', '13', '15', '17', '19', '21', '23', '25', '27', '29', '31', '33', '35', '37', '39', '43', '45', '4.55', '48', '52']
 #27Codes

 df = pd.read_excel(sales,sheet_name=None,ignore_index = True, skiprows=7)
 #27 Sheets
 for i in codes:
      for key in df.keys():
          df['Sheet1']['Code'] = i

我不明白为什么我似乎在每个数据帧中都有i。我想我明白为什么我不知道如何纠正它。我是编码初学者。

预期输出:

df['Sheet1']

   Date         Particulars    Inwards  Code

1 2017-04-01         EFG           12800    01
2 2017-07-22         ABC           100      01
3 2017-09-05         BCD           10000    01
4 2018-03-13         ABC           2000     01

Code 列在下一个数据帧中应为 02,依此类推。

在此之后,我想 concat 数据框和 group_by 详细信息,然后写入 Excel。

【问题讨论】:

您正在遍历所有代码和所有键,我认为您只需要所有对。所以像for i, key in zip(codes, df.keys()): df[key]['Code'] = i 这样的东西可能就是你想要的。 你需要多个索引 @pault 非常感谢。我已经在这里待了将近5个小时。请将其添加为答案,如果可以提供更多解释,我将非常喜欢了解更多信息。 【参考方案1】:

您可以为此使用字典推导:

df = k: v.assign(Code=x) for x, (k, v) in zip(codes, df.items())

pd.DataFrame.assign 允许您添加具有固定值的系列。

【讨论】:

感谢@jpp 这行得通,但是在这个和评论中的那个之间,哪个会被认为是更好的选择? pault 的回答可能更有效。但如果性能不是问题,请选择对您更有意义的。【参考方案2】:

在读取具有多个工作表的工作簿时,pandas.read_excel 返回一个 DataFrame 字典,其中字典的键是工作表的名称。

您似乎想根据列表中的值向每个 DataFrame 添加列代码。

您的代码:

for i in codes:
    for key in df.keys():
        df['Sheet1']['Code'] = i

有两个问题。首先,在循环内你根本没有使用key。您总是在访问"Sheet1"。其次,这是一个双 for 循环,这意味着它将为每个代码遍历每个工作表。

您想要的是并行循环这些值。基本上你想做以下事情:

for i in range(len(codes)):
    code = codes[i]
    key = df.keys()[i]
    df[key]['Code'] = code

这正是zip() 所做的。因此,您可以将上述循环更紧凑地编写为:

for code, key in zip(codes, df.keys()):
    df[key]['Code'] = code

这不是假设codes 的长度等于字典df 中的键数。

之后,您可以使用 pandas.concat 连接所有 DataFrame:

combined = pd.concat(df)

这很有效,因为concat:

获取Series、DataFrame的序列或映射

...

如果传递了 dict,则排序后的键将用作键参数,除非 > 传递,在这种情况下将选择值(见下文)。

【讨论】:

感谢@pault,解释确实有助于记忆和学习。如果可能的话,您能否添加如何groupby ['Particulars'],它返回一个对象,我似乎无法弄清楚(即使有很多答案)为什么我无法获得@987654337 @ 从中。基本上想要将所有具有相同Particulars 的行放入一个新的数据框中。我有办法,但似乎应该使用 groupbysort @Sid groupby 需要一个聚合函数。我想你只是想对数据框进行排序,但我对你想要的输出并不完全清楚。我认为在这种情况下,您应该提出一个新问题,因为这是一个单独的问题。

以上是关于如何使用 for 循环将列值添加到数据框字典中,以便每个数据框都有一个唯一的列?的主要内容,如果未能解决你的问题,请参考以下文章

将列添加到由python中的for循环计算的数据框中

遍历嵌套字典以创建数据框并添加新的列值

Python:如何在比较其他列时将列值填充到另一个数据框中的新列?

熊猫(python):如何将列添加到数据框以进行索引?

将列添加到数据框列表并进行增量添加/循环通过 df 进行简单添加

如何仅将列值插入前一千行