如何在函数之后将pandas组中的值添加到新数据帧?

如何在函数之后将pandas组中的值添加到新数据帧?,pandas,pandas-groupby,Pandas,Pandas Groupby,我试图将一个数据帧分成多个组,通过一个函数运行每个组,并将每个组第一行的返回值放入一个新的数据帧中 当我尝试下面的代码时,我可以打印出我想要的信息,但是当我尝试将其添加到新的数据帧时,它只显示最后一个组的值 如何将每个组的值添加到新的数据帧中 谢谢 以下是我到目前为止的情况: import pandas as pd import numpy as np #Build random dataframe df = pd.DataFrame(np.random.randint(0,40,size=1

我试图将一个数据帧分成多个组,通过一个函数运行每个组,并将每个组第一行的返回值放入一个新的数据帧中

当我尝试下面的代码时,我可以打印出我想要的信息,但是当我尝试将其添加到新的数据帧时,它只显示最后一个组的值

如何将每个组的值添加到新的数据帧中

谢谢

以下是我到目前为止的情况:

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

不相关,但可以尝试修改
任何函数来利用矢量化函数

如果我没弄错的话:

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

不相关,但可以尝试修改
任何函数来利用矢量化函数

如果我没弄错的话:

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

这行代码给了我想要的结果。我只需要在创建列时使用“date”变量设置索引,而不是在创建Dataframe时

df2.loc[date, "newValue"] = any_func(df.loc[date])[0]

这行代码给了我想要的结果。我只需要在创建列时使用“date”变量设置索引,而不是在创建Dataframe时

df2.loc[date, "newValue"] = any_func(df.loc[date])[0]

您可以为每个循环分配整个列的
df2[“newValue”]
。是的,您已经预先指定了索引,因此值将仅在索引上对齐,但因为您正在设置在先前迭代中为非null的整个列行,所以这些行将被覆盖,直到最后一次。如果你想更新逻辑,你可以先使用
combine\u
,或者更简单一点,将结果附加到列表中,然后在循环后调用
pd.concat(该列表)
。谢谢你解释发生了什么。您能否提供一些关于如何解决更新逻辑问题的代码?您可以为每个循环分配整个列的
df2[“newValue”]
。是的,您已经预先指定了索引,因此值将仅在索引上对齐,但因为您正在设置在先前迭代中为非null的整个列行,所以这些行将被覆盖,直到最后一次。如果你想更新逻辑,你可以先使用
combine\u
,或者更简单一点,将结果附加到列表中,然后在循环后调用
pd.concat(该列表)
。谢谢你解释发生了什么。你能提供一些关于如何通过更新逻辑来解决问题的代码吗?谢谢你的回复。如果我从函数中取出代码,这将非常有效,但是当我尝试在函数中运行它时,它会返回错误:“IndexingError:索引器太多”。感谢您的响应。如果我将代码从函数中取出,这将非常有效,但是当我尝试在函数中运行它时,它会返回错误:“IndexingError:索引器太多”。