我有一个数据帧:
>>> d = {'ID' : ['ABC', 'ABC', 'ABC', 'DFG', 'DFG', 'DFG', 'EGF', '2BD', '2BD'], 'Val': ['High', 'Low', 'High', 'High', 'High', 'Low', 'Low', 'Low', 'High'],
... 'Num': [22,2,16,10,50,3,2,34,2], 'Val2':['Low', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High']}
>>> import pandas as pd
>>> df = pd.DataFrame(d)
>>> df
ID Num Val Val2
0 ABC 22 High Low
1 ABC 2 Low High
2 ABC 16 High Low
3 DFG 10 High High
4 DFG 50 High High
5 DFG 3 Low High
6 EGF 2 Low High
7 2BD 34 Low High
8 2BD 2 High High
我想要这样的输出:
ID | Val | Num | Val2
ABC | High | 22 | Low
DFG | High | 50 | High
EGF | Low | 2 | High
2BD | High | 2 | High
i、 例如,对于第一列中的相同ID,它检查Val列,赋予“high”值高于“Low”或“Mod”,然后从Val列中具有“high”的ID行中选择“Num”列中具有较高值的行。
我的做法如下:
import pandas as pd
d = {'ID' : ['ABC', 'ABC', 'ABC', 'DFG', 'DFG', 'DFG', 'EGF', '2BD', '2BD'], 'Val': ['High', 'Low', 'High', 'High', 'High', 'Low', 'Low', 'Low', 'High'], 'Num': [22,2,16,10,50,3,2,34,2], 'Val2':['Low', 'High', 'Low', 'High', 'High', 'High', 'High', 'High', 'High']}
df = pd.DataFrame(d)
print df
x = df.ID.unique().tolist()
f_df=pd.DataFrame()
idlist=[]
vallist=[]
numlist=[]
for i in x:
idlist.append(i)
new_df = df.loc[df['ID'] == i]
h_df = new_df.loc[df['Val'] == 'High']
if h_df.empty:
m_df = new_df.loc[df['Val'] == 'Mod']
if m_df.empty:
l_df = new_df.loc[df['Val'] == 'Low']
vallist.append('Low')
if len(l_df) > 1:
m = l_df['Num'].max()
numlist.append(m)
else:
m = l_df['Num'].max()
numlist.append(m)
else:
vallist.append('Mod')
if len(m_df) > 1:
m = m_df['Num'].max()
numlist.append(m)
else:
m = m_df['Num'].max()
numlist.append(m)
else:
vallist.append('High')
if len(h_df) > 1:
m = h_df['Num'].max()
numlist.append(m)
else:
m = h_df['Num'].max()
numlist.append(m)
f_df['ID'] = idlist
f_df['Val'] = vallist
f_df['Num'] = numlist
print f_df
有更好的方法吗?另外,我如何也得到相应的值
Val2