Python:将唯一 ID 分组并将值合并到一个数组中
Python: Group Unique ids and Merge Values into an Array
我有一个 pandas
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
重命名新列。
是你想要的吗?希望对您有所帮助。
UPD:
步骤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]
UPD:
第 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']]]
我有一个 pandas
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
重命名新列。
是你想要的吗?希望对您有所帮助。
UPD:
步骤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]
UPD:
第 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']]]