如何将唯一行的 Pandas 数据框列转换为单独的列标题、计数并对相邻行值求和?

Mik*_*ike 3 python-2.7 pandas

我有动态项目名称,所以我希望代码:

  • 确定每个用户/日期找到的所有项目名称
  • 创建找到的唯一项目的列标题
  • 对每个用户/日期找到的项目进行计数和求和
  • 每个用户/日期找到的项目数的总和分钟

这是我目前要走的代码路线,但我不确定是否有更简化的方法来做到这一点,而不是创建一个空的数据框并尝试将数据填充到其中?欢迎任何建议,谢谢!

示例 df:

Name    Date        Item    Minutes
Dave    10-02-2017  item1   3
Dave    10-02-2017  item2   5
Joe     10-02-2017  item3   2
Dave    10-02-2017  item2   1
Dave    10-02-2017  item2   2
Marcia  10-02-2017  item1   5
Amy     10-02-2017  item2   3
Run Code Online (Sandbox Code Playgroud)

代码:

#find unique values in df column
unique_df = pd.DataFrame(df['Item'].unique())
#number length of unique rows
unique_df_len = len(unique_df)
#create empty dataframe using unique number of items discovered
new_df = pd.DataFrame([(0,)*unique_df_len])
#replace columns headings with unique row value names
new_df.columns = unique_df.iloc[:,0]
#loop through empty dataframe column headings
for column_name in list(new1):
    #loop through df looking for each item name
    for index, row in df.iterrows(): df['Item'] = df.lookup(df.index,df[column_name]) 
Run Code Online (Sandbox Code Playgroud)

这就是我被卡住的地方......上面的第二个循环不起作用。

期望输出:

Name    Date        item1   item2   item3   total minutes
Dave    10-02-2017  1       3       0       11
Joe     10-02-2017  0       0       1       2
Marcia  10-02-2017  1       0       0       5
Amy     10-02-2017  0       1       0       3
Run Code Online (Sandbox Code Playgroud)

WeN*_*Ben 5

简单的 pivot_table

total=df.groupby(['Name','Date']).Minutes.sum()

df=pd.pivot_table(df,index=['Name','Date'],columns='Item',values='Minutes',aggfunc=len,fill_value=0)
Out[1070]: 
    Item               item1  item2  item3
Name   Date                           
Amy    10-02-2017      0      1      0
Dave   10-02-2017      1      3      0
Joe    10-02-2017      0      0      1
Marcia 10-02-2017      1      0      0

df['total minutes']=total

df.reset_index()
Out[1111]: 
Item    Name        Date  item1  item2  item3  total minutes
0        Amy  10-02-2017      0      1      0              3
1       Dave  10-02-2017      1      3      0             11
2        Joe  10-02-2017      0      0      1              2
3     Marcia  10-02-2017      1      0      0              5
Run Code Online (Sandbox Code Playgroud)

或者您可以使用crosstab获取count

df=pd.crosstab(index=[df['Name'],df['Date']],columns=df['Item'])
df
Out[1093]: 
Item               item1  item2  item3
Name   Date                           
Amy    10-02-2017      0      1      0
Dave   10-02-2017      1      3      0
Joe    10-02-2017      0      0      1
Marcia 10-02-2017      1      0      0
Run Code Online (Sandbox Code Playgroud)