回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有以下带有多级列的dataframe</p>
<pre class="lang-py prettyprint-override"><code>In [1]: data = {('A', '10'):[1,3,0,1],
('A', '20'):[3,2,0,0],
('A', '30'):[0,0,3,0],
('B', '10'):[3,0,0,0],
('B', '20'):[0,5,0,0],
('B', '30'):[0,0,1,0],
('C', '10'):[0,0,0,2],
('C', '20'):[1,0,0,0],
('C', '30'):[0,0,0,0]
}
df = pd.DataFrame(data)
df
Out[1]:
A B C
10 20 30 10 20 30 10 20 30
0 1 3 0 3 0 0 0 1 0
1 3 2 0 0 5 0 0 0 0
2 0 0 3 0 0 1 0 0 0
3 1 0 0 0 0 0 2 0 0
</code></pre>
<p>在新列<code>results</code>中,我希望返回包含每个子集(即第二级列)最大值的组合列名</p>
<p>我想要的输出应该如下所示</p>
<pre class="lang-py prettyprint-override"><code>Out[2]:
A B C
10 20 30 10 20 30 10 20 30 results
0 1 3 0 3 0 0 0 1 0 A20&B10&C20
1 3 2 0 0 5 0 0 0 0 A10&B20
2 0 0 3 0 0 1 0 0 0 A30&B30
3 1 0 0 0 0 0 2 0 0 A10&C10
</code></pre>
<p><strong>例如,第一行:</strong></p>
<p>对于<strong>'A'</strong>列,最大值位于<strong>'20'</strong>列下;
对于列<strong>'B'</strong>,在<strong>'10'</strong>下只有一个值;
对于列<strong>'C'</strong>,它也是<strong>'20'</strong>下的一个值;
因此结果将是<code>A20&B10&C20</code></p>
<p><strong>编辑</strong>:在<code>results</code>列中将“+”替换为“&;”,显然我被误解了,你们认为我需要求和,而我需要用分隔符分隔列名</p>
<p><strong>Edit2:</strong>
由于某种原因,下面@A.B提供的解决方案对我不起作用。虽然它是在他的工作和谷歌colab的样本数据</p>
<p>不知何故<code>.idxmax(skipna = True)</code>导致了<code>ValueError: No axis named 1 for object type Series</code></p>
<p>我找到了一个解决方法,在这一步之前将数据转置,然后在这一步之后将其转置回去</p>
<pre class="lang-py prettyprint-override"><code>map_res = lambda x: ",".join(list(filter(None,['' if isinstance(x[a], float) else (x[a][0]+x[a][1]) for a in x.keys()])))
df['results'] = df.replace(0, np.nan)\
.T\ # Transpose here
.groupby(level=0)\ # Remove (axis=1) from here
.idxmax(skipna = True)\
.T\ # Transpose back here
.apply(map_res,axis=1)
</code></pre>
<p>我仍然有兴趣知道为什么没有转置它就不能工作</p>