如何在python27中的数据框中找到行中的Common元素

时间:2018-05-03 06:58:06

标签: python python-2.7 pandas dataframe

我有一个包含很多行的数据框,我想在行中找到一个公共元素,在该行中找到最小值,我无法找到任何内置函数。

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

在row0 col2和col3中,公共元素为2

在第2行col1和col3中,公共元素为3

是否有任何函数可以找到一行中的公共元素,并且该行中的最小值也是

Hii,我还有一个问题

我在数据框中有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 :(得分:1)

我认为普通值没有功能,所以需要创建它:

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

编辑:

对于创建多个DataFrame,您的解决方案很好,但更好的是更有活力:

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具有相同的colums名称,则可以使用:

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

答案 1 :(得分:0)

转置数据框,然后使用内置函数。

>>>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

答案 2 :(得分:0)

您可以执行以下操作。这将返回每行数据帧中最常见的元素。如果没有公共元素,则返回行中的随机元素。

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)