pandas.apply expand column ValueError: If using all scalar values, you must pass a index
Posted
技术标签:
【中文标题】pandas.apply expand column ValueError: If using all scalar values, you must pass a index【英文标题】:pandas.apply expand column ValueError: If using all scalar values, you must pass an index 【发布时间】:2020-12-20 11:19:00 【问题描述】:我想对 DataFrame 应用一个函数,该函数为原始数据集中的每一列返回几列。 apply 函数返回一个带有列和索引的 DataFrame,但它仍然会引发错误 ValueError: If using all scalar values, you must pass an index.
我尝试设置输出数据框的名称,将列设置为多索引并将索引设置为多索引,但它不起作用。
示例:我有这个输入数据框
df_all_users = pd.DataFrame(
[[1, 2, 3],
[1, 2, 3],
[1, 2, 3],
],
index=["2020-01-01", "2020-01-02", "2020-01-03"],
columns=["user_1", "user_2", "user_3"])
user_1 user_2 user_3
2020-01-01 1 2 3
2020-01-02 1 2 3
2020-01-03 1 2 3
apply_function 是这样的:
def apply_function(df):
df_out = pd.DataFrame(index=df.index)
# these columns are in reality computed used some other functions
df_out["column_1"] = df.values # example: pyod.ocsvm.OCSVM.fit_predict(df.values)
df_out["column_2"] = - df.values # example: pyod.knn.KNN.fit_predict(df.values)
# these are the things I've tried without working
df_out.name = df.name
df_out.columns = pd.MultiIndex.from_tuples([(df.name, column) for column in df_out.columns],
names=["user", "score"])
df_out.index = pd.MultiIndex.from_tuples([(df.name, idx) for idx in df_out.index],
names=["user", "date"])
print(df_out)
return df_out
df_all_users.apply(apply_function, axis=0, result_type="expand")
这会引发错误:
ValueError: 如果使用所有标量值,则必须传递索引
我期望的输出是这样的:
out_df = pd.DataFrame(
[[1, 1, 2, 2, 3, 3],
[1, 1, 2, 2, 3, 3],
[1, 1, 2, 2, 3, 3],
],
index=["2020-01-01", "2020-01-02", "2020-01-03"],
columns=pd.MultiIndex.from_tuples([(user, column)
for user in ["user_1", "user_2", "user_3"]
for column in ["column_1", "column_2"]],
names=("user", "score"))
)
user_1 user_2 user_3
column_1 column_2 column_1 column_2 column_1 column_2
2020-01-01 1 1 2 2 3 3
2020-01-02 1 1 2 2 3 3
2020-01-03 1 1 2 2 3 3
【问题讨论】:
你的输出应该有多少列? 6+指数?您的第一行只有 3 列。 输出应该有 6 列,是的。我想从输入的 3 到输出的 6。 【参考方案1】:好的,答案是将输出转换为一系列数组,然后将结果连接起来:
import pandas as pd
df_all_users = pd.DataFrame(
[[1, 2, 3],
[1, 2, 3],
[1, 2, 3],
],
index=["2020-01-01", "2020-01-02", "2020-01-03"],
columns=["user_1", "user_2", "user_3"])
def apply_function(df):
df_out = pd.DataFrame(index=df.index)
df_out["column_1"] = df.values
df_out["column_2"] = df.values
df_out = pd.Series([values for values in df_out.values], index=df.index)
df_out.name = df.name
return df_out
df_out = df_all_users.groupby(level=0, axis=1).apply(apply_function)
df_out = pd.DataFrame([np.concatenate(values, axis=0) for values in df_out.values],
index=df_out.index,
columns=pd.MultiIndex.from_tuples([(user, column)
for column in ["column_1", "column_2"]
for user in df_out.columns
], names=["user", "algorithm"]))
df_out
user user_1 user_2 user_3
algorithm column_1 column_2 column_1 column_2 column_1 column_2
2020-01-01 1 1 2 2 3 3
2020-01-02 1 1 2 2 3 3
2020-01-03 1 1 2 2 3 3
【讨论】:
【参考方案2】:这样做:
import numpy as np
df_all_users[np.repeat(df_all_users.columns.values,2)]
【讨论】:
也许我没有澄清我的意图:我不想复制数据,而是对用户的数据应用不同的函数,每个返回函数返回不同的列,我将描述编辑为显示这个以上是关于pandas.apply expand column ValueError: If using all scalar values, you must pass a index的主要内容,如果未能解决你的问题,请参考以下文章