Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 拆分列并在索引中使用重复项聚合结果_Python_Pandas - Fatal编程技术网

Python 拆分列并在索引中使用重复项聚合结果

Python 拆分列并在索引中使用重复项聚合结果,python,pandas,Python,Pandas,我有以下数据帧: ID Type Value 1 A 311 1 A 223 1 B 1233 2 A 424 2 A 553 3 A 11 3 B 4 3 B 5 我正在尝试通过拆分列“Type”来聚合“ID”列,这样每个ID都有

我有以下数据帧:

ID     Type      Value
1        A         311
1        A         223
1        B        1233
2        A         424
2        A         553
3        A          11
3        B           4
3        B           5
我正在尝试通过拆分列“Type”来聚合“ID”列,这样每个ID都有自己的行以及类型A和类型B的相应列。在列“A”和“B”中,我希望分配跨行的每个相应值的第一次出现。如果A或B(或两者)缺失,我想分配NaN。为了明确这一点,以下示例描述了我正在寻找的结果:

   ID       A           B
    1      311        1233
    2      424         NaN
    3       11           4
结果将保留为A显示的第一个值(而忽略223的第二个值)。由于ID 1中没有B的第二个值,因此它只保留值1233。对于其他ID,此逻辑将继续

我一直在尝试使用
.pivot
解决这个问题

df.pivot(columns="Type",values="Value")
这有助于我分离类型列,这样我可以得到:

Type      A        B
  0      311      NaN
  1      223      NaN
  2      NaN     1233
  3      11         4
但是,我无法将ID列作为索引传递,因为它会导致以下错误:

ValueError: Index contains duplicate entries, cannot reshape

但是,在ID列上使用
drop_duplicates
,会导致数据丢失。在pandas中有没有方便的方法来执行这样的操作?

您需要先删除重复项,然后再旋转

df.drop_duplicates(['ID', 'Type']).pivot('ID', 'Type', 'Value')

Type      A       B
ID                 
1     311.0  1233.0
2     424.0     NaN
3      11.0     4.0

或者,将
pivot_table
aggfunc='first'
一起使用:

df.pivot_table(index='ID', columns='Type', values='Value', aggfunc='first')

Type      A       B
ID                 
1     311.0  1233.0
2     424.0     NaN
3      11.0     4.0

性能
这实际上取决于您的数据和组数。最好是用你自己的数据来测试它

df_ = df.copy()
df = pd.concat([df_] * 10000, ignore_index=True)

%timeit df.pivot_table(index='ID', columns='Type', values='Value', aggfunc='first')
%timeit df.drop_duplicates(['ID', 'Type']).pivot('ID', 'Type', 'Value')
%timeit df.groupby(['ID', 'Type']).Value.first().unstack(1)

15.2 ms ± 272 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
8.63 ms ± 98 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
8.34 ms ± 246 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

首先使用
groupby

df.groupby(['ID','Type']).Value.first().unstack()
Type      A       B
ID                 
1     311.0  1233.0
2     424.0     NaN
3      11.0     4.0
或者使用
groupby
head
pivot

df.groupby(['ID','Type'],as_index=False).head(1).pivot('ID', 'Type', 'Value')
Type      A       B
ID                 
1     311.0  1233.0
2     424.0     NaN
3      11.0     4.0

你的轴心代码是什么?我想第三排应该是
3114
wow这正是我想做的!非常感谢!我会接受一次,所以让我:)