Python 基于列名和值的条件对数据帧进行切片
我有一个数据框,列名称为语言,最后一列包含帐户名:Python 基于列名和值的条件对数据帧进行切片,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有一个数据框,列名称为语言,最后一列包含帐户名: EN DE IT Account Milan Mailand Milano Italy Florence Florenz Firenze Italy London London Londra UK Belgrade Belgrad Belgrado World 我需要从这个数据库中提取信息,根据列名(语言)和accou
EN DE IT Account
Milan Mailand Milano Italy
Florence Florenz Firenze Italy
London London Londra UK
Belgrade Belgrad Belgrado World
我需要从这个数据库中提取信息,根据列名(语言)和account列中的值的组合创建所有可能的列表
例如,此处的输出为:
EN_Italy = ['Milan', 'Florence']
DE_Italy = ['Mailand', 'Florenz']
IT_Italy = ['Milano', 'Firenze']
EN_UK = ['London']
DE_UK = ['London']
IT_UK = ['Londra']
EN_World = ['Belgrade']
DE_World = ['Belgrad']
IT_World = ['Belgrado']
有可能这样做吗?
谢谢大家! 您可以:
df = df.groupby("Account").aggregate(lambda k: list(k)).reset_index()
Account DE EN IT
0 Italy [Mailand, Florenz] [Milan, Florence] [Milano, Firenze]
1 UK [London] [London] [Londra]
2 World [Belgrad] [b] [Belgrado]
要获取列表,请进行简单选择,例如:
df[df.Account == "Italy"]["DE"]
0 [Mailand, Florenz]
对于数量可变的变量,字典通常是一个不错的选择 您可以为此使用:
from collections import defaultdict
d = defaultdict(list)
for row in df.itertuples():
for i in row._fields[1:-1]:
d[i+'_'+row.Account].append(getattr(row, i))
结果
defaultdict(list,
{'DE_Italy': ['Mailand', 'Florenz'],
'DE_UK': ['London'],
'DE_World': ['Belgrad'],
'EN_Italy': ['Milan', 'Florence'],
'EN_UK': ['London'],
'EN_World': ['Belgrade'],
'IT_Italy': ['Milano', 'Firenze'],
'IT_UK': ['Londra'],
'IT_World': ['Belgrado']})
解释
- 初始化列表的
defaultdict
- 迭代dataframe的行,并为每行迭代语言列名
- 对于内部循环,根据需要追加字典项
accts = df['Account']
langs = [col for col in df.columns if col != 'Account']
result = {'{}_{}'.format(lang, acct): df.loc[df['Account']==acct, lang].tolist() \
for lang in langs for acct in accts}
使用堆栈
df.set_index('Account').unstack().groupby(level=[0, 1]).apply(list)
Account
EN Italy [Milan, Florence]
UK [London]
World [Belgrade]
DE Italy [Mailand, Florenz]
UK [London]
World [Belgrad]
IT Italy [Milano, Firenze]
UK [Londra]
World [Belgrado]
dtype: object
d = df.set_index('Account').ustack().groupby(level=[0, 1]).apply(list)
d.index = d.index.map('_'.join)
d
EN_Italy [Milan, Florence]
EN_UK [London]
EN_World [Belgrade]
DE_Italy [Mailand, Florenz]
DE_UK [London]
DE_World [Belgrad]
IT_Italy [Milano, Firenze]
IT_UK [Londra]
IT_World [Belgrado]
dtype: object
或
到目前为止你试过什么?你的问题和这个例子有什么不同?有没有一种方法可以在使用“\”进行koining之前反转对象的列?因此,从几个方面来看,它将成为意大利而不是意大利。最简单的方法是使用
unstack
而不是stack
d.to_dict()
{'DE_Italy': ['Mailand', 'Florenz'],
'DE_UK': ['London'],
'DE_World': ['Belgrad'],
'EN_Italy': ['Milan', 'Florence'],
'EN_UK': ['London'],
'EN_World': ['Belgrade'],
'IT_Italy': ['Milano', 'Firenze'],
'IT_UK': ['Londra'],
'IT_World': ['Belgrado']}