使用行名,列名和最大列值创建数据框

时间:2019-04-20 16:56:50

标签: python-3.x pandas dataframe

我正在浏览我从PACKT购买的视频包,以学习熊猫。作者使用jijna2 style()突出显示了每一列中的最大值。我很快发现我无法在PyCharm中使用该技术。所以我决定提取这些值。

我想做的是通过从具有N列的数据框中提取行索引,列名和最大列值来创建三列数据框,然后创建新的数据框。新的数据框将显示每一行(如果有联系,则显示所有适当的行),列和该列中的最大值。

我创建了一个玩具数据框只是为了通过代码工作。

我的代码在下面,在输出的最下面,实际上是我希望新数据框的外观。

我知道我正在使用打印声明。到目前为止,该代码是我唯一使用过的东西,如果我有领带,它可以正确拾取多行。

我抓住了整行,我不想。我也不确定如何从提取的数据中构造建议的新数据框。

ERROR in src/app/character.service.ts(27,20): error TS2538: Type 'string[]' cannot be used as an index type.

2 个答案:

答案 0 :(得分:3)

您可以使用.where并用mask等于a的无m stack x值,然后用df.where(df.eq(df.max())).stack().sort_index(level=1).reset_index() Rows animals 0 0 row_3 dogs 86.0 1 row_9 dogs 86.0 2 row_4 cats 80.0 3 row_8 sheep 89.0 4 row_6 lizards 88.0 5 row_7 lizards 88.0 6 row_1 birds 82.0 来检查

data_source

答案 1 :(得分:1)

numpy.where用于匹配的max的索引,并通过建立索引来创建新的DataFrame-如果性能在大型DataFrame中很重要,则更好:

c, r = np.where(df.eq(df.max()).T)
df = pd.DataFrame({'idx':df.index[r], 'cols':df.columns[c], 'vals': df.values[r, c]})
print(df)
     idx     cols  vals
0  row_3     dogs    86
1  row_9     dogs    86
2  row_4     cats    80
3  row_8    sheep    89
4  row_6  lizards    88
5  row_7  lizards    88
6  row_1    birds    82

另一个DataFrame.unstackGroupBy.transform的熊猫解决方案,用于通过第一级比较每组的max值:

s = df.unstack()
df = s[s.groupby(level=0).transform('max').eq(s)].reset_index(name='vals')
print(df)
   animals   Rows  vals
0     dogs  row_3    86
1     dogs  row_9    86
2     cats  row_4    80
3    sheep  row_8    89
4  lizards  row_6    88
5  lizards  row_7    88
6    birds  row_1    82