Как вернуть имена столбцов из вызова df.apply в python?

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

Есть несколько других обсуждений stackoverflow о 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

person dizzy    schedule 08.04.2020    source источник


Ответы (2)


Вы можете назвать индексы 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

person Ivo Severins    schedule 08.04.2020

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

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

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

person Adam Jensen    schedule 08.04.2020