使用pandas将没有唯一行的列分组到一个列中

2024-10-05 13:21:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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—这只是数据的一个示例—数据太大,并且有更多的列,而且可以有许多这样的行。如何在不影响数据质量的情况下删除重复行


Tags: 数据name示例格式质量情况classaa
2条回答

你能做到的

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

您可以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

相关问题 更多 >

    热门问题