【发布时间】:2017-10-20 01:57:48
【问题描述】:
我在使用 pandas 代码时遇到问题,在尝试寻找答案数小时后,我终于放弃并来这里寻求帮助!
我的数据框是从较大的 excel 文件创建的,它包含同时定义为索引的特定观察值。现在我有一个专栏,其中这些观察提供了文本答案,并且这些观察中的大多数都提供了几个响应。这是我的输出示例。
Org Data1
x aaa
x aaa
x bbb
y aaa
z ccc
z ddd
z ddd
我想要实现的是:
Org One Two Three Four
x 1 1 0 0
y 1 0 0 0
z 0 0 1 1
Data1 column is deleted and new columns correspond text answers like this:
"One" = aaa, "Two" = bbb, "Three" = ccc, and "Four" = ddd.
这个想法是通过索引“Org”将所有内容组合在一起,并根据“Data1”列的答案创建新列。因此,在示例中,由于“Org”x 在“Data1”中响应 aaa 两次和 bbb 一次,代码将创建一个新列“One”和“Two”,并使用 true 或 false 函数将 1 或 0 放置到这个新的柱子。这个想法也是忽略多次给出的响应,但我猜对于 true 或 false 函数,这不是问题,也不需要删除重复项(?)。请注意,答案没有任何特定的顺序,我总共有大约 10000 行,我使用 loc 来选择我感兴趣的特定“Org”:s。
这是我迄今为止尝试过的:
df = pd.read_excel("location\test.xlsx", sheetname="Sheet1",
index_col="Org").loc[["x", "y", "z"], ["Data1"]]
df["One"] = np.where(df["Data1"].str.contains["aaa"], "1", "0")
通过同时执行 df["Two"]、df["Three"] 等,最后删除 Data1 列,并通过使用 groupby 和 sum 进一步处理结果,我能够得到最终结果。但是,然后我有带有“2”或“3”的列,而不是我正在寻找的“1”。显然,这不是一项需要进一步处理的艰巨任务,但我一直在尝试提出比 groupby 和 sum 更好的解决方案,因为这将有助于将来处理这个 excel 文件。
我尝试过的如下:
1
df = pd.read_excel("location\test.xlsx", sheetname="Sheet1",
index_col="Org").loc[["x", "y", "z"], ["Data1"]].groupby("Org").agg(lambda
x: set (x))
2
df = pd.read_excel("location\test.xlsx", sheetname="Sheet1",
index_col="Org").loc[["x", "y", "z"], ["Data1"]].groupby(["Org"])
["Data1"].agg(lambda x: ";;".join(set(x.astype(str)))).str.split(";;")
第一个解决方案工作正常,因为它将相同的索引“Org”答案分组到前几行中的一行。但是,当应用 np.where 和 str.contains 时,我收到了新列“One”,其中每个观察“Org”都有“1”,这是错误的。第二种解决方案无法正常运行,因为它丢失了在处理每个可能的“aaa”“bbb”“ccc”“ddd”答案之前所需的原始列名,并且我无法使用 np 查找“aaa” .where 和 str.contains。
有没有人能帮我解决这个“棘手”的问题,因为我还在学习熊猫。提前谢谢!
【问题讨论】: