Индексные столбцы исчезли после лямбда-функции в Pandas - PullRequest
0 голосов
/ 11 мая 2018

Я хотел вычислить процент некоторого объекта за один час («Время»), поэтому я попытался написать лямбда-функцию, и я думаю, что она выполняет свою работу, но столбцы индекса исчезли, столбцы, по которым сгруппирован массив данных.

df = df.groupby(['id', 'name', 'time', 'object', 'type'], as_index=True, sort=False)['col1', 'col2', 'col3', 'col4', 'col5'].apply(lambda x: x * 100 / 3600).reset_index()

После этого кода я печатаю df.columns и получаю это:

Index([u'index', u'col1', col2', u'col3',
       u'col4', u'col5'],
      dtype='object')

Если есть необходимость, я напишу таблицу со значениями для каждого столбца. Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 11 мая 2018

Данные из Jpp

df[['col1','col2']]*=100/3600
df
Out[110]: 
       col1      col2  id name
0  0.138889  0.250000   1    A
1  0.166667  0.111111   2    B
2  0.222222  0.138889   1    A
0 голосов
/ 11 мая 2018

Вы применяете .reset_index(), который сбрасывает индекс. Взгляните на документацию pandas и вы увидите, что .reset_index() передает индекс в столбцы.

0 голосов
/ 11 мая 2018

Если переместить цикл наружу, код будет работать значительно быстрее:

for c in ['col1', 'col2', 'col3', 'col4', 'col5']:
    df[c] *= 100. / 3600

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

Это также выигралоне изменяйте индекс любым способом.

0 голосов
/ 11 мая 2018

pd.DataFrame.groupby используется для агрегирования данных, а не для применения функции к нескольким столбцам.

Для простых функций вы должны искать векторизованное решение. Например:

# set up simple dataframe
df = pd.DataFrame({'id': [1, 2, 1], 'name': ['A', 'B', 'A'],
                   'col1': [5, 6, 8], 'col2': [9, 4, 5]})

# apply logic in a vectorised way on multiple columns
df[['col1', 'col2']] = df[['col1', 'col2']].values * 100 / 3600

Если вы хотите установить индекс в виде нескольких столбцов и хотите использовать pd.DataFrame.apply, это возможно в виде двух отдельных шагов. Например:

df = df.set_index(['id', 'name'])
df[['col1', 'col2']] = df[['col1', 'col2']].apply(lambda x: x * 100 / 3600)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...