鉴于此,我有一个数据框,如下所示:
import pandas as pd
import numpy as np
dict = {
"A": [[1,2,3,4],[3],[2,8,4],[5,8]]
}
dt = pd.DataFrame(dict)
我希望B列中的每一行都具有最大和最小值。我最喜欢的输出是:
A B
0 [1, 2, 3, 4] [1,4]
1 [3] [3,3]
2 [2, 8, 4] [2,8]
3 [5, 8] [5,8]
我已经尝试过的以下代码不起作用:
dt["B"] =[np.min(dt.A), np.max(dt.A)]
答案 0 :(得分:10)
赞:
In [1592]: dt['B'] = dt.A.apply(lambda x: [min(x), max(x)])
In [1593]: dt
Out[1593]:
A B
0 [1, 2, 3, 4] [1, 4]
1 [3] [3, 3]
2 [2, 8, 4] [2, 8]
3 [5, 8] [5, 8]
如@ Ch3steR所建议,请使用map
,因为它更快:
dt['B'] = dt.A.map(lambda x: [min(x), max(x)])
答案 1 :(得分:10)
您可以创建DataFrame
,然后通过DataFrame.agg
创建最小值和最大值,转换为列表,如果要求没有循环(Apply
是幕后的循环),则分配回来:>
df = pd.DataFrame(dt.A.tolist())
dt['B'] = df.agg(['min','max'], axis=1).astype(int).values.tolist()
print (dt)
A B
0 [1, 2, 3, 4] [1, 4]
1 [3] [3, 3]
2 [2, 8, 4] [2, 8]
3 [5, 8] [5, 8]
如果没问题,则用list comprehension
循环另一个解决方案,它应该像apply
一样快,取决于实际数据:
dt['B'] = [[min(x), max(x)] for x in dt.A]
答案 2 :(得分:6)
只需使用explode
替代:
dt['B'] = (dt['A'].explode().astype(int).groupby(level=0).agg(['min','max'])
.to_numpy().tolist())
print(dt)
A B
0 [1, 2, 3, 4] [1, 4]
1 [3] [3, 3]
2 [2, 8, 4] [2, 8]
3 [5, 8] [5, 8]
答案 3 :(得分:4)