【问题标题】:How to find Common element in row in data frame in python27如何在python27中的数据框中找到行中的公共元素
【发布时间】:2018-10-13 09:28:56
【问题描述】:

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

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

在 row2 col1 和 col3 中具有共同元素为 3

是否有任何函数可以在一行中找到一个公共元素并在该行中找到最小最大值

嗨,我还有一个问题

我在数据框中有 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 列执行与上述相同的操作?

【问题讨论】:

  • 你的样本输出是什么?
  • 回答有问题?
  • 你能告诉我上面问的一种更有效的方法吗
  • @Chetan.B - 检查我的编辑。

标签: python python-2.7 pandas dataframe


【解决方案1】:

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

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

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

    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
    

    编辑:

    对于创建多个DataFrames,您的解决方案很好,但更好的是更具动态性:

    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
    

    编辑1:

    如果每个 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
    

    【讨论】:

    • 说如果我有 100 列,那么我必须使用 dfcol1 = pd.concat([x.iloc[:, 0] for x in dfs],axis=1) 这 100 次我想让这个动态
    • @Chetan.B - 我想如果有 100 个数据框,并且每个数据框只需要第一列。
    • @Chetan.B - 有 100 个具有相同结构的 DataFrame?列名相同?
    • 输入数据帧 = 3,每帧 100 列 >> 输出数据帧 =100,每帧 3 列
    • @Chetan.B - 我修改答案,请检查。
    【解决方案3】:

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

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 2017-12-23
      • 2020-12-01
      相关资源
      最近更新 更多