我有一个数据帧,它由两个列名分组,假设标题如下:
A, B, C, D, E, F
IdxA, IdxB
derp foo 1 5 6 3 2 1
derp bar 2 3 4 1 9 0
...
对于每个IdxB,我想获得E列和Fn列中所有唯一值对的列表,以及D列中唯一值的列表。目前我使用的是一个循环,其内容如下:
for (IdxA, IdxB), tbl in grouped:
pairValues = tbl[['E', 'F']].drop_duplicates()
E_unique = tbl['D'].unique()
print IdxB
print E_unique
for _, row in pairValues.iterrows():
print row['E'] + ' ' + row['F']
print
我觉得有更好的方法可以做到这一点,但我有点像熊猫。。。有更好的方法吗?还是我用了一种足够"蟒蛇"的方式?
注意:单元格实际上包含文本数据,而不是数字,我只是为了简单起见使用了数字。
示例输出:
IdxB Name (eg. foo)
List of unique values belonging to IdxB (content is IP addresses)
List of unique string pairs from ['E','F'] belonging to IdxB (content is strings)
非常感谢
一个起点是重置索引,然后按indexb分组。假设您的数据帧称为df:
def gimmeStuff(group):
data = group.drop_duplicates(['E', 'F'])
return data[['D', 'E', 'F']]
df.reset_index(inplace=True)
results = df.groupby('IdxB').apply(gimmeStuff)
由于你方没有提供真实的数据,我无法进行真正的测试——可能会有拼写错误,但这是我的说法。这将为您提供一个由IdxB
索引的数据集,该数据集包含列D、E、F。对于每个IdxB,D将重复包含相同的值,并且E、F将是唯一的组合。
更新
/edit说,如果你不想重新索引:,你实际上可以直接对数据进行分组
results = df.groupby(level=1).apply(gimmeStuff)