Python:将唯一 ID 分组并将值合并到数组中

标签 python pandas matrix-indexing

我有一个看起来像这样的 pandas DF

DF:

       name ;time_cost
        x   ;28800000, 250 
        x   ;39600000, 300 
        x   ;61200000, 250 
        x   ;72000000, 0 
        y   ;86400000, 0 
        y   ;115200000, 250 
        y   ;126000000, 300 
        y   ;147600000, 250
        y   ;158400000, 0

df.head().to_dict()
{'name': {0: 'x',
          1: 'x',
          2: 'x',
          3: 'x'},
 'time_cost': {0: '28800000, 250',
                1: '39600000, 300',
                2: '61200000, 250',
                0: '72000000, 0'}}

我试图将 time_cost 中的所有值放入一个数组中,如下所示:

[[[28800000, 250],
[39600000, 300],
[61200000, 250],
[72000000, 0 ],
[86400000, 0 ]],
[[115200000, 250],
[126000000, 300],
[147600000, 250],
[158400000, 0]]]

这是我尝试过的:

    import pandas as pd

        df = pd.read_csv('file.csv', sep=';')
        def f(df):
            return pd.Series(dict(timecost_range = "%s" % '| '.join(df['time_cost'])))

        result = df.groupby('name').apply(f)
        result
                timecost_range
        name    
        x       28800000, 250| 39600000, 300| 61200000, 250| 72000000, 0
        y       86400000, 0| 115200000, 250| 126000000, 300| 147600000, 250|...

这有点作用,但并不完全是我想要的。任何想法或建议都会有用。

最佳答案

在我的示例中,数据是:

df= pd.DataFrame({'name': {0: 'x',
          1: 'x',
          2: 'x',
          3: 'y'},
 'time_cost': {0: '28800000, 250',
                1: '39600000, 300',
                2: '61200000, 250',
                3: '72000000, 0'}})

第 1 步。您可以使用类似这样的方法来获得结果:

def split_function(n):
    return n.split(',')

df['time_cost'] = df.time_cost.apply(split_function)

输出:

name         time_cost
0    x  [28800000,  250]
1    x  [39600000,  300]
2    x  [61200000,  250]
3    y    [72000000,  0]

第 2 步。如果您希望 DataFrame 中有两个不同的列,您可以使用:

df.time_cost.apply(pd.Series)

输出:

          0     1
0  28800000   250
1  39600000   300
2  61200000   250
3  72000000     0

第 3 步。然后加入他们:

df = df.join(df.time_cost.apply(pd.Series))

输出:

name         time_cost         0     1
0    x  [28800000,  250]  28800000   250
1    x  [39600000,  300]  39600000   300
2    x  [61200000,  250]  61200000   250
3    y    [72000000,  0]  72000000     0

然后,您可以使用 drop 删除“time_cost”列,并使用 rename 重命名新列(如果您愿意)。

这是你想要的吗?希望对您有所帮助。

更新:

第 4 步。如果您想按名称分组,可以使用以下命令:

df[0] = df[0].astype(int)
df[1] = df[1].astype(int)

def concat_function_0(df):
    return np.array(df[0])
def concat_function_1(df):
    return np.array(df[1])

df = pd.DataFrame([df.groupby('name').apply(concat_function_1), df.groupby('name').apply(concat_function_0)]).T

它不是Pythonic,但它可以工作=)

输出:

name               0                               1                                                 
x     [250, 300, 250]  [28800000, 39600000, 61200000]
y                 [0]                      [72000000]

更新:

第 5 步。为了获得结果,请在第一步之后使用以下命令:

def df_to_array(df):
    return list(df.time_cost)

result = df.groupby('name').apply(df_to_array).values

输出:

[[['28800000', ' 250'], ['39600000', ' 300'], ['61200000', ' 250']]
 [['72000000', ' 0']]]

关于Python:将唯一 ID 分组并将值合并到数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52086208/

相关文章:

python - 文本地理定位

pandas - 如何使用 Python Pandas 执行三变量相关

arrays - 字符可以用作索引吗?

python - numpy索引解释 ndarray[(4, 2), (5, 3)]

python - 使用第二个矩阵选择三维元素,将 3D 数组展平为 2D 数组

python - 如何仅使用Python提取僧伽罗语的所有Twitter提要?

python - 如何防止 float 不精确影响 numpy.arange?

python - 从配置文件或数据库中读取 Colander Schema

python - 如何计算一列值与另一列中的 jsons 值列表之间的差异,并因此创建 2 个新列?

python - 如何加快 Pandas 的重采样过程?