Pandas: поиск общих значений по столбцам - PullRequest
2 голосов
/ 22 марта 2020

У меня есть следующий фрейм данных:

df = pd.DataFrame({'TX':['bob','tim','frank'],'IL':['fred','bob','tim'],'NE':['tim','joe','bob']})

Я хотел бы изолировать строки, которые встречаются во всех столбцах, чтобы создать список. Ожидаемый результат:

output = ['tim','bob']

Единственный способ добиться этого - использовать циклы, которых я бы хотел избежать. Есть ли встроенная функция pandas, подходящая для этого?

Ответы [ 3 ]

3 голосов
/ 23 марта 2020

Вы можете создать маску для значений счетчиков в столбцах и проверить, не пропустили ли значения в строках, по DataFrame.all:

m = df.apply(pd.value_counts).notna()
print (m)
          TX     IL     NE
bob     True   True   True
frank   True  False  False
fred   False   True  False
joe    False  False   True
tim     True   True   True

L = m.index[m.all(axis=1)].tolist()
print (L)
['bob', 'tim']
1 голос
/ 22 марта 2020

Вы можете достичь этого с помощью pandas.DataFrame.apply() и set.intersection(), например:

cols_set = list(df.apply(lambda col: set(col.values)).values)
output = list(set.intersection(*cols_set))

Результат следующий:

>>> print(output)
['tim', 'bob']
1 голос
/ 22 марта 2020

IIU C,

вы можете сложить все столбцы по вертикали и затем сделать value_counts для подсчета вхождений каждого элемента, мы сделаем это в переменной с именем s

тогда мы хотим, чтобы все вхождения имен были равны max числу вхождений, в этом случае 3, значения столбцов теперь являются индексами благодаря использованию stack

s = df.stack().value_counts()
# or if you want to ignore duplicates column wise
#df.stack().groupby(level=1).unique().explode().value_counts()

print(s)

tim      3
bob      3
frank    1
fred     1
joe      1

s1 = s[s.eq(s.max())].index.tolist()

print(s1)

['tim', 'bob']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...