python-3.x 在没有for循环的情况下对Pandas中的多列应用相同的transform()?

gijlo24d  于 2023-03-31  发布在  Python
关注(0)|答案(3)|浏览(130)

下面的代码可以工作,但只是想知道这是否可以在没有for循环的情况下完成?

data = {'Date': ['2023-01-01', '2023-01-01','2023-01-01', '2023-01-03', '2023-01-03', '2023-01-03'],
        'p1': [5000, 7000, 6421, 9851, 1385, 1475],
        'p2': [22000, 27000, 25000, 29000, 35000, 1257]
        }

df_orig = pd.DataFrame(data)

def norm_std(x):
    return (x- np.mean(x))/np.std(x)


def s_d(df, c):
    df[c] = df.groupby('Date')[c].transform(norm_std)

for c in df_orig.columns[]:
    s_d(df_orig, c)
inb24sb2

inb24sb21#

可以使用applydifferenceapply中排除Date列:

exclude_col = "Date"
valid_cols = df_orig.columns.difference([exclude_col])
date_groupby = df_orig.groupby('Date')
df_orig[valid_cols] = df_orig[valid_cols].apply(lambda x: date_groupby[x.name].transform(norm_std))

df_orig:

Date        p1        p2
0  2023-01-01 -1.357104 -1.297771
1  2023-01-01  1.023084  1.135550
2  2023-01-01  0.334020  0.162221
3  2023-01-03  1.414153  0.493108
4  2023-01-03 -0.718412  0.901328
5  2023-01-03 -0.695741 -1.394436
bis0qfac

bis0qfac2#

因为你的norm_std工作在与原始索引相同的 Dataframe 上,你可以使用apply

df_orig.groupby('Date').apply(norm_std)
idv4meu8

idv4meu83#

可能的解决方案之一是:

df_orig.iloc[:, 1:] = df_orig.groupby('Date').transform(norm_std)

不需要 s_d 函数。
其他可能性:

df_orig = df_orig.set_index('Date').groupby('Date').transform(norm_std).reset_index()

要使 FutureWarning 静音,请将 norm_std 定义为:

def norm_std(x):
    return (x - np.mean(x, axis=0))/np.std(x)

相关问题