小编Chr*_*her的帖子

从行到列重塑pandas数据帧

我正在尝试重塑我的数据.乍一看,它听起来像一个转置,但事实并非如此.我尝试过融化,堆叠/取消堆叠,连接等.

用例

我希望每个唯一个体只有一行,并将所有作业历史记录放在列上.对于客户端,可以更容易地跨行读取信息而不是读取列.

这是数据:

import pandas as pd
import numpy as np

data1 = {'Name': ["Joe", "Joe", "Joe","Jane","Jane"],
        'Job': ["Analyst","Manager","Director","Analyst","Manager"],
        'Job Eff Date': ["1/1/2015","1/1/2016","7/1/2016","1/1/2015","1/1/2016"]}
df2 = pd.DataFrame(data1, columns=['Name', 'Job', 'Job Eff Date'])

df2
Run Code Online (Sandbox Code Playgroud)

这就是我想要它的样子: 所需的输出表

在此输入图像描述

python reshape dataframe pandas pandas-groupby

8
推荐指数
1
解决办法
1993
查看次数

用hlines创建甘特图?

我已经尝试了几个小时来完成这项工作.我尝试使用'python-gantt'包,没有运气.我也尝试了一下(这很漂亮,但我无法在他们的网站上托管我的敏感数据,所以这不起作用).

我的出发点是这里的代码: 如何使用Python Pandas绘制堆叠事件持续时间(甘特图)?

三个要求:

  • 在y轴上包含"名称"而不是数字.
  • 如果有人有多个事件,把所有的活动期间在同一行(这会让模式识别容易),例如,丽莎将只对视觉一行.
  • 包括列在相应行顶部的"事件"(如果可能),例如Lisa的第一行会说"Hire".

代码需要是动态的,以容纳更多的人和更多可能的事件类型......

我愿意接受可视化的建议:我希望显示全年各种人员配置活动的持续时间,以帮助识别模式.

from datetime import datetime
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as dt

df = pd.DataFrame({'Name': ['Joe','Joe','Lisa','Lisa','Lisa','Alice'],
                    'Event': ['Hire','Term','Hire','Transfer','Term','Term'],
                    'Start_Date': ["2014-01-01","2014-02-01","2015-01-01","2015-02-01","2015-03-01","2016-01-01"],
                    'End_Date': ["2014-01-31","2014-03-15","2015-01-31","2015-02-28","2015-05-01","2016-09-01"]
                    })

df = df[['Name','Event','Start_Date','End_Date']]

df.Start_Date = pd.to_datetime(df.Start_Date).astype(datetime)
df.End_Date = pd.to_datetime(df.End_Date).astype(datetime)

fig = plt.figure()
ax = fig.add_subplot(111)
ax = ax.xaxis_date()
ax = plt.hlines(df.index, dt.date2num(df.Start_Date), dt.date2num(df.End_Date))
Run Code Online (Sandbox Code Playgroud)

python matplotlib pandas

7
推荐指数
1
解决办法
2068
查看次数

根据列中的条件创建组/类

我需要帮助转换我的数据,以便我可以阅读交易数据.

商业案例

我正在尝试将一些相关的事务组合在一起,以创建一些组或事件类.这个数据集代表了工作人员参加各种缺席事件.我想根据离开事件类365天内的任何事务创建一类叶子.对于图表趋势,我想对类进行编号,以便获得序列/模式.

我的代码允许我查看第一个事件发生的时间,并且它可以识别新类何时启动,但它不会将每个事务都放入类中.

要求:

  • 根据它们属于哪个类来标记所有行.
  • 每个独特的休假活动编号.使用此示例,索引0将是唯一离开事件2,索引1将是唯一离开事件2,索引3将是唯一离开事件2,并且索引4将是唯一离开事件1,等等.

我在列中添加了所需的输出,标记为"Desired Output".注意,每个人可以有更多行/事件; 而且可能会有更多的人.

一些数据

import pandas as pd

data = {'Employee ID': ["100", "100", "100","100","200","200","200","300"],
        'Effective Date': ["2016-01-01","2015-06-05","2014-07-01","2013-01-01","2016-01-01","2015-01-01","2013-01-01","2014-01"],
        'Desired Output': ["Unique Leave Event 2","Unique Leave Event 2","Unique Leave Event 2","Unique Leave Event 1","Unique Leave Event 2","Unique Leave Event 2","Unique Leave Event 1","Unique Leave Event 1"]}
df = pd.DataFrame(data, columns=['Employee ID','Effective Date','Desired Output'])
Run Code Online (Sandbox Code Playgroud)

我试过的一些代码

df['Effective Date'] = df['Effective Date'].astype('datetime64[ns]')
df['EmplidShift'] = df['Employee ID'].shift(-1)
df['Effdt-Shift'] = df['Effective Date'].shift(-1)
df['Prior Row in Same Emplid Class'] = …
Run Code Online (Sandbox Code Playgroud)

python pandas

7
推荐指数
1
解决办法
1118
查看次数

获取每行倒数第二列不为空的列

我试图获取每行倒数第二个非空列,其中空值可以位于任何列中。诸如此类的解决方案不起作用,因为 null 可以在任何地方:Pandas 选择倒数第二列,该列也不是 nan

不是理想的解决方案: 我能够用以下代码解决它,但必须有一种更简洁的方法来编写它。对于任何反馈,我们都表示感谢。

data = [[1, 10, np.nan, np.nan], [2, 15, 13, np.nan], [9, 14, np.nan, np.nan]] 
df = pd.DataFrame(data, columns = ['a', 'b', 'c', 'd']) 

df['count_nulls'] = len(df.columns) - df.apply(lambda x: x.count(), axis=1)
df['count_nonnull'] = df.apply(lambda x: x.count(), axis=1)-1
df['new_index'] = np.where(df['count_nonnull']==1, 1, 
                             np.where(df['count_nonnull']==0,0, df['count_nonnull'] - 1))
df['value'] = df.values[np.arange(len(df)), df['new_index']-1]
df
Run Code Online (Sandbox Code Playgroud)

python indexing pandas

2
推荐指数
2
解决办法
936
查看次数

删除多索引和自动重命名列

我想将以下输出转换为:

  • 删除多索引(它应该只是一行索引)

  • 相应编号工作1,工作生效日期1,工作2,工作生效日期2等.

  • 如果我选择添加或删除其他变量,我希望这是可扩展的,我不想修改代码以适应它(这是示例缩小).

一些数据:

import pandas as pd
import numpy as np

data1 = {'Name': ["Joe", "Joe", "Joe","Jane","Jane"],
        'Job': ["Analyst","Manager","Director","Analyst","Manager"],
        'Job Eff Date': ["1/1/2015","1/1/2016","7/1/2016","1/1/2015","1/1/2016"]}
df2 = pd.DataFrame(data1, columns=['Name', 'Job', 'Job Eff Date'])

def tgrp(df):
    df = df.drop('Name', axis=1)
    return df.reset_index(drop=True).T

df2.groupby('Name').apply(tgrp).unstack()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

python group-by multi-index dataframe pandas

1
推荐指数
2
解决办法
549
查看次数