Как добавить значения из группы pandas в новый Dataframe после функции? - PullRequest
1 голос
/ 21 января 2020

Я пытаюсь разделить Dataframe на группы, выполнить каждую группу через функцию, и вернуть возвращаемое значение из первой строки каждой группы в новый Dataframe.

Когда я пробую приведенный ниже код, я могу распечатать информацию, которую хочу, но когда я пытаюсь добавить ее в новый Dataframe, он показывает только значения для последней группы.

Как добавить значения из каждой группы в новый Dataframe?

Спасибо,

Вот что у меня есть:

import pandas as pd
import numpy as np

#Build random dataframe
df = pd.DataFrame(np.random.randint(0,40,size=10),
                  columns=["Random"],
                  index=pd.date_range("20200101", freq='6h',periods=10))
df["Random2"] = np.random.randint(70,100,size=10)
df["Random3"] = 2


df.index =df.index.map(lambda t: t.strftime('%Y-%m-%d'))
df.index.name = 'Date'
df.reset_index(inplace=True)

#Setup groups by date 
df = df.groupby(['Date']).apply(lambda x: x.reset_index())
df.drop(["index","Date"],axis=1,inplace = True)

#Creat new dataframe for newValue
df2 = pd.DataFrame(index=(df.index)).unstack()

#random function for an example
def any_func(df):
    df["Value"] = df["Random"] * df["Random2"] / df["Random3"]

    return df["Value"]

#loop by unique group name
for date in df.index.get_level_values('Date').unique():
    #I can print the data I want
    print(any_func(df.loc[date])[0])
    #But when I add it to a new dataframe, it only shows the value from the last group
    df2["newValue"] = any_func(df.loc[date])[0]
df2

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Эта строка кода дала мне желаемый результат. Мне просто нужно было установить индекс с помощью переменной date при создании столбца, а не при создании Dataframe.

df2.loc[date, "newValue"] = any_func(df.loc[date])[0]
0 голосов
/ 21 января 2020

Не имеет отношения, но попробуйте изменить any_func, чтобы использовать векторизованные функции.

Теперь, если я вас правильно понимаю:

new_value = df['Random'] * df['Random2'] / df['Random3']
df2['New Value'] = new_value.loc[:, 0]
...