Выбор первых 50% процентных названий из столбцов кадра данных pandas - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть пандас, который выглядит следующим образом.Строки и столбцы имеют одинаковые имена.

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

Я могу получить 5 самых больших значений, передав df ['column_name']. Nlargest (n = 5), но если мне нужно вернуть 50% от наибольшего в порядке убывания, есть ли что-нибудь, что встроено в его панды, я должен написать для него функцию, как я могу получить их?Я совершенно новичок в питоне.Пожалуйста, помогите мне.

ОБНОВЛЕНИЕ: Итак, давайте примем во внимание столбец a, и он имеет значения, такие как 10, 5, -, 6,8,3 и 4. Я должен суммировать их все и получить верхние 50% из них,итого в этом случае 36. 50% этих значений будет 18. Итак, из столбца а я хочу выбрать только 10 и 8.Точно так же я хочу пройти через все остальные столбцы и выбрать 50%.

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Вы можете сортировать фрейм данных и отображать только 90% данных

df.sort_values('column_name',ascending=False).head(round(0.9*len(df)))
0 голосов
/ 21 ноября 2018

Гибкая сортировка:)

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 () против 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%.-Matt

Глупым хаком было бы отсортировать, найти накопленную сумму, найти середину, разделив ее на общую сумму, а затем использовать ее для выбора части вашего отсортированного столбца.например,

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)

Результат: enter image description here

0 голосов
/ 21 ноября 2018

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...