我有一个像这样的熊猫数据框。行和列的名称相同。
name a b c d e f g
a 10 5 4 8 5 6 4
b 5 10 6 5 4 3 3
c - 4 9 3 6 5 7
d 6 9 8 6 6 8 2
e 8 5 4 4 14 9 6
f 3 3 - 4 5 14 7
g 4 5 8 9 6 7 10
我可以通过传递df ['column_name']。nlargest(n = 5)来获得5个最大值,但是如果我必须按降序返回50%的最大值,那么熊猫中是否内置了任何东西我必须为此编写一个函数,如何获得它们?我是python的新手。请帮帮我。
更新:因此,让我们考虑a列,它的值类似于10、5,-,6、8、3和4。我必须将它们全部加起来并得到前50%。因此,在这种情况下,总数为36。这些值的50%为18。因此,从a列中,我只想选择10和8。同样,我想浏览所有其他列并选择50%。
答案 0 :(得分:6)
排序很灵活:)
df.sort_values('column_name',ascending=False).head(int(df.shape[0]*.5))
更新:frac参数仅在.sample()上可用,而在.head或.tail中不可用。 df.sample(frac = .5)的确给出了50%,但头和尾仅期望int。 df.head(frac = .5)失败,出现 TypeError:head()得到了意外的关键字参数'frac'
注意:关于int()vs round()
int(3.X) == 3 # True Where 0 >= X >=9
round(3.45) == 3 # True
round(3.5) == 4 # True
因此,在执行.head(int / round ...)时,请考虑一下适合您需要的行为。
已更新:要求
因此,我们将a列考虑在内,它的值类似于10, 5,-,6,8,3和4。我必须将它们全部加起来并得到前50% 他们。因此,在这种情况下,总数为36。这些值的50%为 18.因此,从a列中,我只选择10和8。同样,我想浏览所有其他列并选择50%。 -马特
一个愚蠢的办法是排序,找到累积的总和,将其除以总和,然后找到中间值,然后用它来选择已排序列的一部分。例如
import pandas as pd
data = pd.read_csv(
pd.compat.StringIO("""name a b c d e f g
a 10 5 4 8 5 6 4
b 5 10 6 5 4 3 3
c - 4 9 3 6 5 7
d 6 9 8 6 6 8 2
e 8 5 4 4 14 9 6
f 3 3 - 4 5 14 7
g 4 5 8 9 6 7 10"""),
sep=' ', index_col='name'
).dropna(axis=1).apply(
pd.to_numeric, errors='coerce', downcast='signed')
x = data[['a']].sort_values(by='a',ascending=False)[(data[['a']].sort_values(by='a',ascending=False).cumsum()
/data[['a']].sort_values(by='a',ascending=False).sum())<=.5].dropna()
print(x)
答案 1 :(得分:1)
您可以对数据框进行排序,仅显示90%的数据
df.sort_values('column_name',ascending=False).head(round(0.9*len(df)))
答案 2 :(得分:0)
data.csv
name,a,b,c,d,e,f,g
a,10,5,4,8,5,6,4
b,5,10,6,5,4,3,3
c,-,4,9,3,6,5,7
d,6,9,8,6,6,8,2
e,8,5,4,4,14,9,6
f,3,3,-,4,5,14,7
g,4,5,8,9,6,7,10
test.py
#!/bin/python
import pandas as pd
def percentageOfList(l, p):
return l[0:int(len(l) * p)]
df = pd.read_csv('data.csv')
print(percentageOfList(df.sort_values('b', ascending=False)['b'], 0.9))