创建一个数据框,x_df = pd.DataFrame({'a': [1,2,3,4,5,6], 'b': [1,2,1,2,1,2], 'c': ['x','x','y','y','z','z']})Out[56]: a b c0 1 1 x1 2 2 x2 3 1 y3 4 2 y4 5 1 z5 6 2 z现在我想对“c”列的每个值使用一个函数。所以我apply()在groupby.x_df = pd.DataFrame({'a': [1,2,3,4,5,6], 'b': [1,2,1,2,1,2], 'c': ['x','x','y','y','z','z']})def fun(X): print("===============>>>>>>>>>>>>>>>>>>>>> ") print(list(X)) print("\n") c_str = X.c.tolist[0] print("Value of c_str ==========>>> "+ str(c_str)) return yx_df1 = x_df.groupby('c').apply(fun).reset_index()运行上面的代码给出以下输出:---------------------------------------------------------------===============>>>>>>>>>>>>>>>>>>>>> ['a', 'b', 'c']===============>>>>>>>>>>>>>>>>>>>>> ['a', 'b', 'c']===============>>>>>>>>>>>>>>>>>>>>> **['a', 'b']**===============>>>>>>>>>>>>>>>>>>>>> **['a', 'b']**Traceback (most recent call last): File "<ipython-input-20-6870c2554589>", line 12, in <module> x_df1 = x_df.groupby('c').apply(fun).reset_index() File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\groupby\groupby.py", line 930, in apply return self._python_apply_general(f) File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\groupby\groupby.py", line 936, in _python_apply_general self.axis) File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\groupby\groupby.py", line 2273, in apply res = f(group) File "<ipython-input-20-6870c2554589>", line 6, in fun c_str = X.c.tolist[0] File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py", line 4376, in __getattr__ return object.__getattribute__(self, name)AttributeError: 'DataFrame' object has no attribute 'c'因此,函数 fun X 的前两次调用包含所有三列(应该是这种情况),但在第 3 次和第 4 次调用c中缺少列。因此我无法访问它。有人可以指导我做错了什么,为什么c第 3 次和第 4 次调用中没有列?
2 回答

慕码人2483693
TA贡献1860条经验 获得超9个赞

慕桂英546537
TA贡献1848条经验 获得超10个赞
我会尽量回答你的问题,但首先我看到你的帖子有一些问题,所以我想指出它们:
你的格式搞砸了,很难阅读你的代码。
您的
fun
函数未定义您尝试返回的变量:y
。你的问题没有解释最初的问题是什么。您在问您的代码是如何错误的,而不是解决问题的正确方法。
根据您的问题,您想对 C 中的每一行使用 apply 函数,但分组依据c
可能会删除一些行。所以,你可以试试
def fun(X):
return X.c.tolist()[0]
x_df1 = x_df['c'].apply(fun)
但问题可以通过更好的方式解决。您可以只传递列向量,而不是传递分组对象:
x_df1 = x_df['c'].apply(fun)
但是,如果我们知道您要解决的最初问题,那么我会推荐一个 apply lambda 调用:
x_df1 = x_df['c'].apply(lambda x: list(x))
我用过,list()但应该用你想要做的来代替。
添加回答
举报
0/150
提交
取消