根据文本

时间:2017-10-19 16:14:56

标签: python excel 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置于此新柱。这个想法也是为了忽略不止一次给出的响应,但我猜这个函数有效或错误,这不是一个问题,也没有必要删除重复项(?)。请注意,答案没有任何特定的顺序,总共我有大约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。

是否有人能够帮助我解决这个“棘手”问题,因为我还在学习大熊猫。提前谢谢!

2 个答案:

答案 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