Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何生成单元格中字符串计数的Python透视表?_Python_Pandas_Pivot Table - Fatal编程技术网

如何生成单元格中字符串计数的Python透视表?

如何生成单元格中字符串计数的Python透视表?,python,pandas,pivot-table,Python,Pandas,Pivot Table,我在Python3.7.3中创建数据帧(df1)中的字符串计数透视表,并将计数与另一个数据帧(df2)中的字符串值列对齐时遇到问题。如何根据df1中的值用列标题(字符串)的总计数填充第二个数据帧 我有一个145列的数据帧(df1)。它们的名称为“未命名:0”-“未命名:144”。在“Unnamed:0”中是一个非唯一的名称列表,然后超出该列表的每一列都包含在整个数据帧中重复的字符串值。我已经能够创建第二个数据帧(df2),其中包含一个“name”列,该列具有来自“Unnamed:0”的唯一名称值

我在Python3.7.3中创建数据帧(df1)中的字符串计数透视表,并将计数与另一个数据帧(df2)中的字符串值列对齐时遇到问题。如何根据df1中的值用列标题(字符串)的总计数填充第二个数据帧

我有一个145列的数据帧(df1)。它们的名称为“未命名:0”-“未命名:144”。在“Unnamed:0”中是一个非唯一的名称列表,然后超出该列表的每一列都包含在整个数据帧中重复的字符串值。我已经能够创建第二个数据帧(df2),其中包含一个“name”列,该列具有来自“Unnamed:0”的唯一名称值。它还包含大约80个其他列,这些列是在df1的“Unnamed:1”-“Unnamed:144”中找到的唯一值。在下面,您将看到我的步骤以及我正在使用的和预期输出的示例数据帧(因为我不会发布145列df)。任何帮助都会得到感激

#使用熊猫导入的df1
df1=pd.read\u excel('path/to/file')
##df2的创建
#创建了一个临时df
tmp_df=df1.drop(列=['Unnamed:0'])
array=tmp_df['Unnamed:1']#创建数组以从df1中查找唯一值
对于tmp_df.列中的列:
array=array.append(tmp_-df[col]).reset_-index(drop=True)
#为名称和df1值创建了唯一的值数组
array2=array.unique()
name=df['Unnamed:0'].unique()
#创建临时dfs以生成df2
名称\u df=pd.DataFrame(名称)
names.columns=['name']
strvals_df=pd.DataFrame(columns=array2)
df2=pd.concat([name\u df.reset\u index(drop=True),strvals\u df],axis=1)
df2=df2.loc[:,df2.columns.notnull()]
数据帧示例:

df1
Unnamed: 0  Unnamed: 1  Unnamed: 2  Unnamed: 3  Unnamed: 4  Unnamed: 5
name1       str1        str1        str2        str2        str3
name1       str4        NaN         str3        str1        str4
name1       str1        str1        str2        str2        str3
name2       str4        NaN         str3        str1        str4
name3       str1        str1        str2        str2        str3
name3       str4        NaN         str3        str1        str4
name4       str1        str1        str2        str2        str3

df2 (current)
name    str1    str2    str3    str4
name1   NaN     NaN     NaN     NaN
name2   NaN     NaN     NaN     NaN
name3   NaN     NaN     NaN     NaN   
name4   NaN     NaN     NaN     NaN 

df2 (desired output, counts of str values from df1 in columns)
name    str1    str2    str3    str4
name1   5       4       3       2
name2   1       0       1       2
name3   3       2       2       2   
name4   2       2       1       0

我尝试过在数据帧中循环并使用嵌套for循环,但没有成功。我还尝试了pandas的pivot_table命令,但我一直得到一个只计算名称出现次数的表。我甚至尝试过按索引顺序制作两个巨大的重复数组,并使用pivot_table函数,但这也不起作用。

stack
首先,您不需要
df2



使用
str.get\u dummies很简单

df.set_index('Unnamed: 0').stack().str.get_dummies().sum(level=0)


Out[1515]:
                str1  str2  str3  str4
Unnamed: 0
name1          5     4     3     2
name2          1     0     1     2
name3          3     2     2     2
name4          2     2     1     0

最后一行不应该是
2 2 1 0
?你说得对……打字错误
columns  str1  str2  str3  str4
names
name1       5     4     3     2
name2       1     0     1     2
name3       3     2     2     2
name4       2     2     1     0
df.set_index('Unnamed: 0').stack().str.get_dummies().sum(level=0)


Out[1515]:
                str1  str2  str3  str4
Unnamed: 0
name1          5     4     3     2
name2          1     0     1     2
name3          3     2     2     2
name4          2     2     1     0