如何使用 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
的行放入一个新的数据框中。我有办法,但似乎应该使用 groupby
和 sort
。
@Sid groupby 需要一个聚合函数。我想你只是想对数据框进行排序,但我对你想要的输出并不完全清楚。我认为在这种情况下,您应该提出一个新问题,因为这是一个单独的问题。以上是关于如何使用 for 循环将列值添加到数据框字典中,以便每个数据框都有一个唯一的列?的主要内容,如果未能解决你的问题,请参考以下文章
Python:如何在比较其他列时将列值填充到另一个数据框中的新列?