python - Pandas 分组和减少 DataFrame

标签 python numpy pandas

我对 Python 相当陌生,对 Pandas 也很陌生(我学习 Pandas 比学习 Python 更困难)。

我正在尝试转换大型数据集,但我陷入困境。

  1. 我从具有以下结构的 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/

相关文章:

python - 获取显示屏4个角在图像上的坐标

Python 框架 : Website/CMS vs application?

python - 你能让 numpy 除以 0 给出错误而不是警告吗?

html - 使用 pandas read_html 提取 href

python - 如何用列名替换类别的 fillna ?

python - 根据 Pandas 中的列名和位置选择列

python - pandas.to_datetime 包含最后两位数字的年份

python - 在python中解析json字符串列表

python - 处理不同形状的数组时如何对齐矩阵(使用python)

python - 如何以正确的格式在文本文件中写入两个 numpy 数组?