Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于列名和值的条件对数据帧进行切片_Python_Python 3.x_Pandas_Dataframe - Fatal编程技术网

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的行,并为每行迭代语言列名
  • 对于内部循环,根据需要追加字典项

这只是另一种理解dict的方法:

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']}