我正在尝试重塑我的数据.乍一看,它听起来像一个转置,但事实并非如此.我尝试过融化,堆叠/取消堆叠,连接等.
用例
我希望每个唯一个体只有一行,并将所有作业历史记录放在列上.对于客户端,可以更容易地跨行读取信息而不是读取列.
这是数据:
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-gantt'包,没有运气.我也尝试了一下(这很漂亮,但我无法在他们的网站上托管我的敏感数据,所以这不起作用).
我的出发点是这里的代码: 如何使用Python Pandas绘制堆叠事件持续时间(甘特图)?
三个要求:
代码需要是动态的,以容纳更多的人和更多可能的事件类型......
我愿意接受可视化的建议:我希望显示全年各种人员配置活动的持续时间,以帮助识别模式.
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) 我需要帮助转换我的数据,以便我可以阅读交易数据.
商业案例
我正在尝试将一些相关的事务组合在一起,以创建一些组或事件类.这个数据集代表了工作人员参加各种缺席事件.我想根据离开事件类365天内的任何事务创建一类叶子.对于图表趋势,我想对类进行编号,以便获得序列/模式.
我的代码允许我查看第一个事件发生的时间,并且它可以识别新类何时启动,但它不会将每个事务都放入类中.
要求:
我在列中添加了所需的输出,标记为"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) 我试图获取每行倒数第二个非空列,其中空值可以位于任何列中。诸如此类的解决方案不起作用,因为 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) 我想将以下输出转换为:
删除多索引(它应该只是一行索引)
相应编号工作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)
pandas ×5
python ×5
dataframe ×2
group-by ×1
indexing ×1
matplotlib ×1
multi-index ×1
reshape ×1