如何在Pandas中将多列表合并为单列表并适配df.loc使用?
解决Pandas中TypeError: unhashable type: 'list'的问题
错误原因
你当前的all_accounts是嵌套列表结构——里面直接把assets、liabilities这些列表变量塞了进去,导致df.loc接收的列参数包含子列表。而Pandas要求列索引必须是可哈希的单个字符串,列表是不可哈希类型,因此触发报错。
正确的列表合并方式
要把所有账户列表整合成扁平的字符串列表,以下几种方法都适用:
方法1:列表加法拼接
适合少量列表变量的场景:
df = pd.read_csv('2021BALANCE.csv') menor = (df['account_1'] < 10000) assets = ['account_1', 'account_2', 'account_3'] liabilities = ['account_6' , 'account_4'] profits = ['account_20' , 'account_21'] # 用+号把所有列表拼接成扁平列表 all_accounts = ['account_9345', 'account_234623'] + assets + liabilities + profits # 正常调用df.loc df.loc[menor, all_accounts]
方法2:扩展解包语法(*)
适合大量列表变量的场景,写法更简洁:
# 用*把每个列表展开后合并 all_accounts = ['account_9345', 'account_234623', *assets, *liabilities, *profits]
方法3:批量处理大量列表变量
如果有几十上百个这类账户列表变量,可以先把它们统一放到一个容器里,再用itertools.chain合并:
import itertools # 把所有账户列表变量放到一个大列表里 all_account_groups = [assets, liabilities, profits] # 合并已有账户和所有分组账户 all_accounts = ['account_9345', 'account_234623'] + list(itertools.chain(*all_account_groups))
注意事项
合并后的all_accounts必须是纯字符串列表,要确保所有账户名称都存在于DataFrame的列名中,否则会触发KeyError。
内容的提问来源于stack exchange,提问作者Jorge Villa
相关产品推荐
相关产品推荐

