Найдите по двум значениям и заполните - PullRequest
2 голосов
/ 18 марта 2019

У меня есть фрейм данных (мой реальный содержит 50 000 строк и 34 столбцов):

df = pd.DataFrame({
    'NAME': ['APPLE COMPANY A', 'BANANA COMPANY B', 'ORANGE COMPANY C', 'APPLE COMPANY A'],
    'INVESTMENTS': ['OIL LTD', 'GOLD LTD', 'GAS LTD', 'GAS LTD'],
    'STOCKS' : [100, 200, 300, 400],
    'OIL LTD': [0, 0, 0, 0],
    'GOLD LTD': [0, 0, 0, 0],
    'GAS LTD': [0, 0, 0, 0],
    })

               NAME INVESTMENTS  STOCKS  OIL LTD  GOLD LTD  GAS LTD
0   APPLE COMPANY A     OIL LTD     100        0         0        0
1  BANANA COMPANY B    GOLD LTD     200        0         0        0
2  ORANGE COMPANY C     GAS LTD     300        0         0        0
3   APPLE COMPANY A     GAS LTD     400        0         0        0

Как мне найти значения из столбца STOCKS на основе значений из NAME и имен столбцов?Например, для первого значения в столбце OIL LTD он ищет APPLE COMPANY A в столбце NAME и OIL LTD (на основе столбца с тем же именем) в столбце INVESTMENTS, что дает значение 100 иможно увидеть ниже.Таким образом, искомое значение берется из имени столбца OIL LTD, GOLD LTD, GAS LTD и т. Д. На основе значений из NAME и INVESTMENTS.

Я хочу, чтобы вывод выглядел какthis:

               NAME INVESTMENTS  STOCKS  OIL LTD  GOLD LTD  GAS LTD
0   APPLE COMPANY A     OIL LTD     100      100         0      400
1  BANANA COMPANY B    GOLD LTD     200        0       200        0
2  ORANGE COMPANY C     GAS LTD     300        0         0      300
3   APPLE COMPANY A     GAS LTD     400        0         0      400

Я бы обычно использовал pd.merge(), если хочу найти одно значение, но не уверен, работает ли оно с двумя значениями.Он работает с Excel, но для каждого столбца требуется 15 минут, что неэффективно.

1 Ответ

1 голос
/ 18 марта 2019

Если последние столбцы заполнены только 0 решением является pivot, то удалите столбцы и последнее объединение:

df1 = df.pivot('NAME','INVESTMENTS','STOCKS').fillna(0).astype(int)
df = df.drop(df1.columns, axis=1).join(df1, on='NAME')
print (df)
               NAME INVESTMENTS  STOCKS  GAS LTD  GOLD LTD  OIL LTD
0   APPLE COMPANY A     OIL LTD     100      400         0      100
1  BANANA COMPANY B    GOLD LTD     200        0       200        0
2  ORANGE COMPANY C     GAS LTD     300      300         0        0
3   APPLE COMPANY A     GAS LTD     400      400         0      100

Если порядок столбцов необходим такой же, как в оригинальном DataFrame:

cols = df.columns.drop(['NAME','INVESTMENTS','STOCKS'])
df1 = df.pivot('NAME','INVESTMENTS','STOCKS').fillna(0).astype(int)[cols]
df = df.drop(df1.columns, axis=1).join(df1, on='NAME')
print (df)
               NAME INVESTMENTS  STOCKS  OIL LTD  GOLD LTD  GAS LTD
0   APPLE COMPANY A     OIL LTD     100      100         0      400
1  BANANA COMPANY B    GOLD LTD     200        0       200        0
2  ORANGE COMPANY C     GAS LTD     300        0         0      300
3   APPLE COMPANY A     GAS LTD     400      100         0      400
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...