import pandas as pd
import numpy as np
def main():
df = pd.DataFrame([["a", "b", "c", "k"],["d", "e", "f", "l"],['g','h','i', "J"]], columns=["ay", "be", "ce", "jay"])
print(df)
gb1 = df.groupby({"ay": "x", "be": "x"}, axis=1)
gb2 = df.groupby({"ay": "x", "be": "x", "ce": "y", "jay": "y"}, axis=1)
print("apply sum by axis 0")
#print(df.apply(sum))
print("fails")
print("apply sum by axis 1")
# print(df.apply(sum, axis=1))
print("fails")
print("agg sum by axis 0")
print(df.agg(sum))
print("agg sum by axis 1")
print(df.agg(sum, axis=1))
print("gb1 apply sum axis 1")
print(gb1.apply(sum))
print("gb1 agg sum axis 1")
print(gb1.agg(sum))
print("gb2 apply sum axis 1")
# print(gb2.apply(sum))
print("fails")
print("gb2 agg sum axis 1")
print(gb2.agg(sum))
print(gb1.agg(lambda x: ";".join([x[0], x[1]]))
if __name__ == "__main__":
main()
我不了解发生的失败,我也不明白为什么对2个组应用失败但对1个组失败。
我已经实现了总体目标(我试图将一些列的字符串连接在一起),但是我担心这些失败会让我感到困惑。
参考的驱动目标是能够做到
gb1.agg(lambda x: ";".join(x))
我也不明白为什么这样不起作用
尤其是自
gb1.agg(lambda x: ";".join([x[0], x[1]]) does
答案 0 :(得分:1)
里面有很多东西可以打开。
print("apply sum by axis 0")
#print(df.apply(sum))
print("fails")
print("apply sum by axis 1")
# print(df.apply(sum, axis=1))
print("fails")
...以上操作失败,因为您正在应用-使用需要数字类型的Python sum函数。您可以使用以下任何一种方法来解决此问题(我认为,这实际上取决于numpy处理大熊猫将其转换为的对象dtypes的能力):
df.apply(np.sum)
df.sum()
接下来,这两项在print语句中都说axis = 1,但实际上不是:
print("gb1 apply sum axis 1")
print(gb1.apply(sum))
print("gb2 apply sum axis 1")
# print(gb2.apply(sum))
print("fails")
...如果添加axis = 1,它们将起作用并给出合理的结果。
请注意,您在以下位置缺少右括号:
gb1.agg(lambda x: ";".join([x[0], x[1]])
...同时在示例代码中和后面的注释中。
似乎您是在说代码的最后一点是实现您的目标的要素。上一次尝试:
gb1.agg(lambda x: ";".join(x))
...正在加入存在的一组的 index 中的项目,而不是单个系列。检查:
print(gb1.groups)
最后,给定您的数据框,如果您要执行的操作是将列与“;”连接起来他们之间,您也可以这样做:
cols = ['ay','be']
df.apply(lambda x: ";".join((x[c] for c in cols)), axis=1)
或少量物品
df['concat'] = df['ay'] + ";" + df['be']
...而不是使用groupby。