我有一个包含很多行的数据框,我想在行中找到一个公共元素,在该行中找到最小值,我无法找到任何内置函数。
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列的相同操作吗?
答案 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)