我对 Python 相当陌生,对 Pandas 也很陌生(我学习 Pandas 比学习 Python 更困难)。
我正在尝试转换大型数据集,但我陷入困境。
我从具有以下结构的 CSV 上传数据。
DATE ID CATEGORY 1 SUCCESS (0 or 1) 1/1/2015 a1 x 0 1/1/2015 a2 y 0 1/1/2015 a3 z 0 1/3/2015 a2 z 0 1/5/2015 a1 x 0 1/7/2015 a2 z 1 1/9/2015 a3 y 0 1/10/2015 a2 z 1 1/11/2015 a3 y 0
我的最终目标是找到一种方法将其分组为表单,在该表单中我可以获得导致特定 ID 成功标志的一系列类别,然后是从上一行相同 ID 开始所耗时数组。
所以结果会是这样的:
{a2: {'1':((y,z,z),(0,2,4)), '2':((z),(0))}
我不确定 Pandas 或 NumPy 的多维数组是否更适合该任务。我也不确定在 Pandas 中可以使用更多哪些函数来完成此任务。
指向正确方向的一点将会非常有帮助。
最佳答案
我并不 100% 理解这个问题。 我不确定 (0,2,4) 是什么意思。 好的,让我们开始吧。
这是一种非 pandas 式的方式,所有数据帧都循环。
我有 csv 格式的数据,因此按如下方式加载:
import pandas as pd
import numpy as np
df = pd.read_csv('data.csv')
print df.head(len(df))
看起来像:
DATE ID CATEGORY SUCCESS
0 1/1/2015 a1 x 0
1 1/1/2015 a2 y 0
2 1/1/2015 a3 z 0
3 1/3/2015 a2 z 0
4 1/5/2015 a1 x 0
5 1/7/2015 a2 z 1
6 1/9/2015 a3 y 0
7 1/10/2015 a2 z 1
8 1/11/2015 a3 y 0
现在是代码:
uber_dict = {}
grouped = df.groupby(['ID'])
for name, group in grouped:
mini_dict = {}
working_list = []
i = 1
for idx,row in group.iterrows():
working_list.append((row['CATEGORY'],row['DATE']))
if row['SUCCESS'] == 1:
df = pd.DataFrame(working_list,columns= ['CATEGORY','DATE']) # let's use a bit more pandas.
df.set_index('CATEGORY',inplace=True)
df["DATE"] = pd.to_datetime(df["DATE"]) # my dates are string format so casting
df['DATE'] = df['DATE'].diff()
df['DATE'].fillna(0,inplace=True)
df['DATE'] = df['DATE'].astype('timedelta64[D]').astype('int')
mini_dict[str(i)] = tuple(zip(*df.to_records()))
working_list=[]
i = i +1
if mini_dict.keys(): # see http://stackoverflow.com/questions/53513/best-way-to-check-if-a-list-is-empty
uber_dict[name] = mini_dict
print uber_dict
产生
{'a2': {'1': (('y', 'z', 'z'), (0, 2, 4)), '2': (('z',), (0,))}}
关于python - Pandas 分组和减少 DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32615697/