pandas 在嵌套框架中的行和列的子集上设置非常量值

92dk7w1h  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(121)

让我们假设我有一个框架D:

D = pd.DataFrame({'a': [1,2,3], 'b': [3,3,4], 'c': [2, 4, 0], 'd': [-1,-1,-1]})
D

    a   b   c   d
0   1   3   2   -1
1   2   3   4   -1
2   3   4   0   -1

字符串
我想对列a、B、c中的值进行排序,比如说前两行,所以预期的结果是

a   b   c   d
0   1   2   3   -1
1   2   3   4   -1
2   3   4   0   -1


为了避免链式赋值警告,我尝试使用df.loc:

D.loc[[0,1], ['a', 'b', 'c']].agg(['min', 'median', 'max'], axis=1)

    min median  max
0   1.0 2.0 3.0
1   2.0 3.0 4.0
D.loc[[0,1], ['a', 'b', 'c']] = D.loc[[0,1], ['a', 'b', 'c']].agg(['min', 'median', 'max'], axis=1)
D

    a   b   c   d
0   NaN NaN NaN -1
1   NaN NaN NaN -1
2   3.0 4.0 0.0 -1

的字符串
由于某些原因,值没有设置。我认为这可能是因为不同的列名,但D.loc[[0,1], ['a', 'b', 'c']] = D.loc[[0,1], ['a', 'b', 'c']].agg(['min', 'median', 'max'], axis=1).rename(columns={"min": "a", "median": "b", "max": "c"})D.loc[[0,1], ['a', 'b', 'c']] = D.loc[[0,1], ['a', 'b', 'c']].agg(['min', 'median', 'max'], axis=1).to_numpy()也不起作用。手动更改值不是一个选择,因为在真实的示例中,我有大约800k行而不是3行,并且希望保持操作的向量化。那么正确的方法应该是什么呢?

ryoqjall

ryoqjall1#

使用numpy.sort

D.loc[[0,1], ['a', 'b', 'c']] = np.sort(D.loc[[0,1], ['a', 'b', 'c']], axis=1)
print (D)
   a  b  c  d
0  1  2  3 -1
1  2  3  4 -1
2  3  4  0 -1

字符串
如果需要分配聚合函数,通过DataFrame.to_numpy将输出转换为numpy数组:

D.loc[[0,1], ['a', 'b', 'c']] = D.loc[[0,1], ['a', 'b', 'c']].agg(['min', 'median', 'max'], axis=1).to_numpy()
print (D)
   a  b  c  d
0  1  2  3 -1
1  2  3  4 -1
2  3  4  0 -1

sxissh06

sxissh062#

为了修复你的例子,使用显式转换to_numpy

cols = ['a', 'b', 'c']
D.loc[0:1, cols] = D.loc[0:1, cols].agg(['min', 'median', 'max'], axis=1).to_numpy()

字符串
如果你想排序,使用numpy.sort将转换为数组:

cols = ['a', 'b', 'c']
D.loc[0:1, cols] = np.sort(D.loc[0:1, cols], axis=1)


输出量:

a  b  c  d
0  1  2  3 -1
1  2  3  4 -1
2  3  4  0 -1

相关问题