使用熊猫将所有行都不唯一的情况下将一列分组

时间:2018-07-25 12:02:09

标签: python pandas dataframe pandas-groupby

Name Class Marks1 Marks2
AA    CC    10     
AA    CC           33
AA    CC    21     
AA    CC           24

我想将上述格式的数据转换为

Name Class Marks1  Marks2
AA   CC    10      33
AA   CC    21      24

我应该如何取得结果? PS-这只是数据的一个示例,数据太大,并且具有更多的列,并且可以具有许多这样的行。如何在不影响数据质量的情况下删除重复的行。

2 个答案:

答案 0 :(得分:0)

你可以做

In [421]: df.groupby(df.index // 2).first()
Out[421]:
  Name Class  Marks1  Marks2
0   AA    CC    10.0    33.0
1   AA    CC    21.0    24.0

答案 1 :(得分:0)

您可以groupby为前两列中的每个值组合并应用custom function

#solution if mising values are empty strings
print (df)
  Name Class Marks1 Marks2
0   AA    CC     10       
1   AA    CC            33
2   AA    CC     21       
3   AA    CC            24

cols = ['Marks1','Marks2']
def f(x):
    v = x.values
    i = np.arange(v.shape[1])
    a = (v == '').argsort(0, kind='mergesort')
    return pd.DataFrame(v[a, i], index=x.index, columns=cols)


df[cols] = df.groupby(['Name','Class'])[cols].apply(f)
#filter out all rows with '' only
df = df[(df[cols] != '').all(axis=1)]
print (df)
  Name Class Marks1 Marks2
0   AA    CC     10     33
1   AA    CC     21     24

#solution if missing values are NaNs
print (df)
  Name Class Marks1 Marks2
0   AA    CC     10    NaN
1   AA    CC    NaN     33
2   AA    CC     21    NaN
3   AA    CC    NaN     24

cols = ['Marks1','Marks2']
def f(x):
    v = x.values
    i = np.arange(v.shape[1])
    a = pd.isnull(v).argsort(0, kind='mergesort')
    arr = v[a, i]
    return pd.DataFrame(arr, index=x.index, columns=cols)


df[cols] = df.groupby(['Name','Class'])[cols].apply(f)
#remove all NaNs rows by column cols
df = df.dropna(subset=cols, how='all')
print (df)
  Name Class Marks1 Marks2
0   AA    CC     10     33
1   AA    CC     21     24