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

时间:2018-04-06 15:23:39

标签: python pandas dictionary dataframe pandas-groupby

我想将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。

TIA

2 个答案:

答案 0 :(得分:5)

您可以使用词典理解:

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

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

答案 1 :(得分:4)

在阅读包含多个工作表的工作簿时,pandas.read_excel会返回一个DataFrames字典,其中字典的键是工作表的名称。

好像你想根据列表中的值为每个DataFrame添加一个列代码。

您的代码:

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

有两个问题。首先,在循环内部,您根本不使用key。您始终可以访问"Sheet1"。其次,这是一个双循环,这意味着它将迭代每个代码的每张表。

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

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,则排序的键将用作keys参数,除非>它被传递,在这种情况下将选择值(见下文)。