Как найти общий элемент в строке во фрейме данных в python27 - PullRequest
0 голосов
/ 03 мая 2018

У меня есть один фрейм данных, содержащий много строк, я хочу найти общий элемент в строке и min max в этой строке, я не могу найти встроенную функцию для этого.

import pandas as pd df = pd.DataFrame({'col1':[1,2,3], 'col2':[2,3,4],'col3':[2,1,3]}) print df

в строке 0 col2 и col3, имеющих общий элемент как 2

в строке 2 col1 и col3, имеющих общий элемент как 3

есть ли функция для нахождения общего элемента в строке, и min max в этой строке также

Привет, у меня есть еще один вопрос

У меня есть n столбцов в кадре данных, и я хочу объединить столбец 1 в столбец 1 по фреймам данных, как я могу сделать это более эффективно.

В настоящее время я использую следующий метод, показывающий только для 3 фреймов данных. Можете ли вы показать мне, как это сделать, если у нас n столбцов

    import pandas as pd
df1 = pd.DataFrame({'col1':[1,2,3], 'col2':[2,3,4],'col3':[4,5,6]})
df2 = pd.DataFrame({'col1':[1,2,3], 'col2':[2,3,4],'col3':[4,5,6]})
df3 = pd.DataFrame({'col1':[1,2,3], 'col2':[2,3,4],'col3':[4,5,6]})

dfcol1 = pd.concat([df1.iloc[:, 0:1], df2.iloc[:, 0:1], df3.iloc[:, 0:1]],axis=1)
dfcol2 = pd.concat([df1.iloc[:, 1:2], df2.iloc[:, 1:2], df3.iloc[:, 1:2]],axis=1)
dfcol3 = pd.concat([df1.iloc[:, 2:3], df2.iloc[:, 2:3], df3.iloc[:, 2:3]],axis=1)

print dfcol1
print dfcol2
print dfcol3

Ожидаемый результат:

   col1  col1  col1
0     1     1     1
1     2     2     2
2     3     3     3
   col2  col2  col2
0     2     2     2
1     3     3     3
2     4     4     4
   col3  col3  col3
0     4     4     4
1     5     5     5
2     6     6     6

Может кто-нибудь сказать мне более эффективный способ сделать то же самое, что и выше для n количество столбцов?

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Я думаю, что нет функции для общих значений, поэтому нужно создать ее:

def f(x):
    s = x.value_counts()
    val = s[s > 1]
    #return one common value if exist 
    return np.nan if val.empty else val.index[0]

a = df.apply(f, 1)
b = df.max(axis=1)
c = df.min(axis=1)

df = pd.concat([a,b,c], axis=1, keys=('first_same', 'max','min'))
print (df)
   first_same  max  min
0         2.0    2    1
1         NaN    3    1
2         3.0    4    3

Если несколько столбцов и возможно более общие значения:

df = pd.DataFrame({'col1':[1,2,3], 'col2':[2,3,4],'col3':[2,1,3],'col4':[1,1,3]})
print (df)
   col1  col2  col3  col4
0     1     2     2     1
1     2     3     1     1
2     3     4     3     3

def f(x):
    s = x.value_counts()
    val = s[s > 1]
    #return all common values in list
    return np.nan if val.empty else val.index.tolist()

a = df.apply(f, 1)
b = df.max(axis=1)
c = df.min(axis=1)

df = pd.concat([a,b,c], axis=1, keys=('common', 'max','min'))
print (df)
   common  max  min
0  [2, 1]    2    1
1     [1]    3    1
2     [3]    4    3

EDIT:

Для создания нескольких DataFrame s ваше решение приятно, но лучше динамично:

dfs = [df1, df2, df3]
dfcol1 = pd.concat([x.iloc[:, 0] for x in dfs],axis=1)
print (dfcol1)
   col1  col1  col1
0     1     1     1
1     2     2     2
2     3     3     3

dfs = [df1, df2, df3]
dfcol2 = pd.concat([x.iloc[:, 1] for x in dfs],axis=1)
print (dfcol2)
   col2  col2  col2
0     2     2     2
1     3     3     3
2     4     4     4

EDIT1:

Если каждый DataFrame имеет одинаковые имена столбцов, можно использовать:

dfs = [df1, df2, df3]
dfall = pd.concat(dfs, keys=('a','b','c'), axis=1)
print (dfall)
     a              b              c          
  col1 col2 col3 col1 col2 col3 col1 col2 col3
0    1    2    4    1    2    4    1    2    4
1    2    3    5    2    3    5    2    3    5
2    3    4    6    3    4    6    3    4    6

dfcol1 = dfall.xs('col1', axis=1, level=1)
print (dfcol1)
   a  b  c
0  1  1  1
1  2  2  2
2  3  3  3
0 голосов
/ 03 мая 2018

Вы можете сделать что-то вроде ниже. Это возвращает наиболее распространенный элемент в каждой строке кадра данных. Если общего элемента нет, возвращается случайный элемент из строки.

import pandas as pd 
df = pd.DataFrame({'col1':[1,2,3], 'col2':[2,3,4],'col3':[2,1,3]}) 
print(df.T.apply(pd.value_counts).fillna(0).idxmax())

# 0    2
# 1    1                                                    
# 2    3                                                     
# dtype: int64                                              

Чтобы найти max каждой строки:

df.max(axis=1)

Чтобы найти min каждой строки:

df.min(axis=1)
0 голосов
/ 03 мая 2018

Транспонируйте фрейм данных, а затем используйте встроенные функции.

>>>df
   col1  col2  col3
0     1     2     2
1     2     3     1
2     3     4     3
>>>df.T.describe()

              0    1         2
count  3.000000  3.0  3.000000
mean   1.666667  2.0  3.333333
std    0.577350  1.0  0.577350
min    1.000000  1.0  3.000000
25%    1.500000  1.5  3.000000
50%    2.000000  2.0  3.000000
75%    2.000000  2.5  3.500000
max    2.000000  3.0  4.000000

>>>df.T.min()
0    1
1    1
2    3

>>>df.T.max()
0    2
1    3
2    4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...