【问题标题】:how to crate the group by in pandas only in one level如何仅在一个级别中在熊猫中创建分组
【发布时间】:2020-10-18 02:28:17
【问题描述】:

我在我的 excel 文件中导入低于 df3 数据框,并且只想对名称和其他重复数据进行分类,应如下所示。

注意(每个月的数据将按月添加。)

Df3 =pd.read_Excel('Data')
print (df3)      

Name    ID  Month   Shift

Jon     1   Feb     A
Jon     1   Jan     B
Jon     1   Mar     C
Mike    1   Jan     A
Mike    1   Jan     B
Jon     1   Feb     C
Jon     1   Jan     A

并且我希望在相同的格式中具有如下所示的输出。请帮助我,就像我被困在这里一样。

将非常感谢您的帮助和支持。

【问题讨论】:

标签: python python-3.x pandas pandas-groupby vscode-python


【解决方案1】:

这是另一种解决方案,使用列表组合和df.duplicated.loc 进行分配。

import numpy as np
df = pd.read_excel(file,sheet_name=yoursheet)

#order the months. 

df['Month'] = pd.Categorical(df['Month'],
               pd.to_datetime(df['Month'],format='%b').drop_duplicates().sort_values().dt.strftime('%b'))



df = df.sort_values(['Month']).reset_index(drop=True)

df1 = pd.concat([data.append(data.iloc[0]) for name,data in df.groupby('Name')])

df1.loc[df1.duplicated(keep='last'),1:] = ''

df1['Name'] = np.where(df1['Month'].ne(''),df1['Month'],df1['Name'])

final = df1.drop('Month',1)

   Name ID Shift
0   Jon         
3   Jan  1     A
4   Feb  1     A
5   Feb  1     C
6   Mar  1     C
0   Jan  1     B
1  Mike         
2   Jan  1     B
1   Jan  1     A

【讨论】:

  • 好吧,当我尝试执行此步骤时------- df1['Name'] = np.where(df1['Month'].ne(''),df1['Month '],df1['名称'])。我有 NameError 错误:未定义名称'np'。但是我也导入了 Numpy
  • @ManojKumar 见上文。
  • 真的非常感谢你帮助我......但是当我运行这段代码时 df['Month'] = pd.Categorical(df['Month'], pd.to_datetime(df[ 'Month'],format='%b').drop_duplicates().sort_values().dt.strftime('%b')).... 显示错误... :( .. 错误显示“ValueError:未转换的数据仍然存在:“
  • 我很抱歉代码正在运行,因为两者之间有空间所以我删除了它,但现在我只有这个代码错误 "df1['Name'] = np.where(df1 ['Month'].ne(''),df1['Month'],df1['Name'])" 错误说 NameError: name 'np' is not defined...不知道该怎么做..
  • @ManojKumar 没问题别忘了接受 YoBen 的回答
【解决方案2】:

代码

#creating sample data as per requirement
import pandas as pd 
df = pd.DataFrame({'Name':['Jon','Jon','Jon','Mike','Mike','Jon','Jon'],'ID':[1,1,1,1,1,1,1], 'Month':['Feb','Jan','Mar','Jan','Jan','Feb','Jan'], 'Shift':['A','B','C','A','B','C','A']})
#display data
df

df['Month'] = pd.Categorical(df['Month'],categories=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],ordered=True)
df = df.sort_values(['Name','Month']).reset_index(drop=True)
#display final data
df

我希望这会有所帮助... :)

【讨论】:

    【解决方案3】:

    你可以通过

    df=df.iloc[pd.to_datetime(df.Month,format='%b').argsort()]
    df=pd.concat([pd.DataFrame({'Month':[x] }).append(y).fillna('').append(pd.DataFrame(dict.fromkeys(y.columns,['']))) for x , y in df.groupby('Name')]).drop('Name',1).iloc[:-1]
    

    print(df)
    
     Month ID Shift
    0   Jon         
    1   Jan  1     B
    6   Jan  1     A
    0   Feb  1     A
    5   Feb  1     C
    2   Mar  1     C
    0               
    0  Mike         
    3   Jan  1     A
    4   Jan  1     B
    

    【讨论】:

    • @YOBNE_S: .. 请您检查一下,因为月份没有增加。它首先是二月,然后是一月,然后是三月。如果你能看到我的输出..它就像一月、一月、二月和三月......对于每个名字..你能帮我做同样的事吗
    • @YOBNE_S :非常感谢,但是当我运行时,我在第一步出现错误。我第一次读取我的文件并创建 df(如 Dataframe-df=pd.read_excel(r'C: \Users\dell\Desktop\stats.xlsx',sheet_name='Sheet5')) .. 然后我跟着你编码器...df.iloc[pd.to_datetime(df.Month,format='%b')。 argsort()].. 它显示错误为“AttributeError: 'DataFrame' object has no attribute 'Month'”.....请检查一下..
    • @YOBNE_S 请帮帮我
    • @ManojKumar 您的问题的解决方案就在这里,文已经为您提供了很好的答案。
    • @Datanovice 那根本不起作用.. 我是 stcuk .. 非常感谢你让我降级 :(.. 请阅读我的评论,因为我再次向 Yobne 提问。我不知道他是怎么做到的.请帮助我,因为我真的被困在这里了。我真的做了很多计算,现在我只需要像这样呈现,老实说我没有这样做,所以请求。请帮助我..
    猜你喜欢
    • 2020-04-30
    • 2018-01-09
    • 2021-10-06
    • 2017-04-10
    • 2017-08-30
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多