Как вернуть имена столбцов из вызова df.apply в python? - PullRequest
0 голосов
/ 08 апреля 2020

Загадка: мне нужно использовать df.apply со строкой данных из df, но я не знаю имен возвращаемых столбцов во время вызова df.apply, а имена столбцов зависят от строки входные данные для df.apply ...

Существуют и другие обсуждения стекопотока о pd.concat и result_type = 'expand', но они не совсем подходят для моих целей.

Пожалуйста ответьте простой, как можно строчками, примените стратегию ..

import pandas as pd

def my_func(x):

    # get_dictionary call will return a consistent number of key/values pairs
    # with the keys being consistent each call.
    # e.g. {'key1': [5], 'key2': [5.6]}
    dict_of_vals = get_dictionary(x.name, x.some_other_value)

    # create a Series with the values - ONE row # can't name columns here??
    return pd.Series( list(dict_of_vals.values()) )


# assume df is init with some number of columns/rows,
# see below for example
df = init()

# I need the keys from the my_func call e.g. dict_of_vals.keys()
# for the column names here
df[DONT_KNOW_KEYS_UNTIL_CALL_TO_MY_FUNC] = df.apply(lambda x: my_func(x), axis=1)

# assume initial table from init call above
   numbers colors
0        1    red
1        2  white
2        3   blue

# want solution to look something like this:
   numbers colors  key1  key2
0        1    red     5   5.6
1        2  white     6   7.7
2        3   blue     7   8.8

Again, I won't know the column names and values until the apply 
calls my_func.


example, if
dict_of_vals = {'key1': [5], 'key2': [5.6]}

I get 
  key1   key2
0  [5]  [5.6]
1  [5]  [5.6]
2  [5]  [5.6]

which is missing the original columns

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Вы можете назвать индексы pandas .Series, они станут именами столбцов в кадре данных, созданном df.apply.

Затем вы можете присоединиться или добавить недавно созданный кадр данных с вашим оригиналом. фрейм данных.

import pandas as pd

df1 = pd.DataFrame(range(5), columns=['Numbers'])

   Numbers
0        0
1        1
2        2
3        3
4        4

def my_func(x):
    number = x['Numbers']
    return pd.Series([number*2, number*3], index=['Times2', 'Times3'])

df2 = df1.apply(lambda x: my_func(x), axis=1)

   Times2  Times3
0       0       0
1       2       3
2       4       6
3       6       9
4       8      12

df_final = df1.join(df2)

   Numbers  Times2  Times3
0        0       0       0
1        1       2       3
2        2       4       6
3        3       6       9
4        4       8      12

0 голосов
/ 08 апреля 2020

Я бы рекомендовал использовать Pandas 'функцию добавления.

df.append(df.apply(lambda x: my_func(x), axis=1))

Таким образом, можно добавить DataFrame из неизвестных столбцов и получить комбинированный DataFrame с их исходными и новыми столбцами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...