我遇到了大熊猫代码的问题,在尝试搜索几个小时的答案后,我终于放弃了,来到这里寻求帮助!
我的数据框是从较大的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置于此新柱。这个想法也是为了忽略不止一次给出的响应,但我猜这个函数有效或错误,这不是一个问题,也没有必要删除重复项(?)。请注意,答案没有任何特定的顺序,总共我有大约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。
是否有人能够帮助我解决这个“棘手”问题,因为我还在学习大熊猫。提前谢谢!
答案 0 :(得分:0)
一种方法是使用Pandas的pivot_table
:
df['num_val']=1
df=df.pivot_table(values='num_val', columns='Data1', index='Org', fill_value=0)
df.columns=['One', 'Two', 'Three', 'Four']
答案 1 :(得分:0)
您可以通过旋转表然后应用条件来获得此信息:
class A