Панды - как сделать ту же строку пустой, а затем написать, чтобы преуспеть с объединенными ячейками - PullRequest
0 голосов
/ 20 января 2019

Этот вопрос на самом деле о 2 случаях:

  1. сделать такое же значение в столбце информационного кадра pandas пустым
  2. сохранить результирующий фрейм данных, чтобы превзойти его с объединенной ячейкой, а текст находится по центру по вертикали

1. часть данных

для кадра данных

df = pd.DataFrame({'Company': ['Huawei','Huawei','Huawei', 'Apple', 'Apple', 'Samsung', 'Samsung'],
                    'Year': [2011, 2011, 2018, 2011, 2019, 2018, 2019],
                    'Product': ['H1', 'H2', 'H3', 'A1', 'A2', 'S1', 'S2']})
df = df.sort_values(by=['Company', 'Year'])
df

т.е.

   Company    Year  Product
3   Apple       2011   A1
4   Apple       2019   A2
0   Huawei      2011   H1
1   Huawei      2011   H2
2   Huawei      2018   H3
5   Samsung     2018   S1
6   Samsung     2019   S2

мне нужно mergeCell(df, on = ['Company']) возвращает

   Company    Year  Product
3   Apple       2011   A1
4               2019   A2
0   Huawei      2011   H1
1               2011   H2
2               2018   H3
5   Samsung     2018   S1
6               2019   S2

пока mergeCell(df, on = ['Company', 'Year']) возвращает

   Company    Year  Product
3   Apple       2011   A1
4   Apple       2019   A2
0   Huawei      2011   H1
1                      H2
2   Huawei      2018   H3
5   Samsung     2018   S1
6   Samsung     2019   S2

Я написал один, но, очевидно, он не лаконичен и имеет ошибку

def mergeCell(df, on):
    import copy

    dfMerged = df[on]

    dfTmp = np.empty((df.shape[0], len(on)), dtype=object)
    lastRow = ()
    idx = 0
    for row in dfMerged.itertuples():
        if idx == 0:
            lastRow = row[1:]
            dfTmp[idx, :] = lastRow
        else:
            if row[1:] != lastRow:
                lastRow = row[1:]
                dfTmp[idx, :] = lastRow
            else:
                dfTmp[idx, :] = np.empty((1, len(on)), dtype=object)

        idx += 1 

    dfTmp = pd.DataFrame(dfTmp)
    dfTmp.columns = on


    dfCopied = copy.deepcopy(df)
    for idxRow in range(df.shape[0]):
        for idxCol in on:
            dfCopied.loc[idxRow, idxCol] = dfTmp.loc[idxRow, idxCol]

    return dfCopied     

Итак, есть ли встроенный способ сделать это?

2. сохраните результирующий информационный фрейм, чтобы преуспеть с объединенной ячейкой, и текст будет в вертикальном центре для этой части я понятия не имею, кроме как делать то, что я делаю в вышеупомянутой функции mergeCell

спасибо

1 Ответ

0 голосов
/ 20 января 2019

Итак, есть ли встроенный способ сделать это?

Да, вы можете использовать команду duplicated.Но будьте осторожны, «пустая клетка» в Пандах может означать одно из двух: либо NaN, либо пустая строка ''.Поскольку вы обеспокоены представлением, я предполагаю, что вы хотите последнее.

Пример 1: pd.Series.duplicated

col = 'Company'
df[col] = df[col].mask(df[col].duplicated(), '')

print(df)

#    Company  Year Product
# 3    Apple  2011      A1
# 4           2019      A2
# 0   Huawei  2011      H1
# 1           2011      H2
# 2           2018      H3
# 5  Samsung  2018      S1
# 6           2019      S2

Пример 2: pd.DataFrame.duplicated

cols = ['Company', 'Year']
df[cols] = df[cols].mask(df[cols].duplicated(), '')

print(df)

#    Company  Year Product
# 3    Apple  2011      A1
# 4    Apple  2019      A2
# 0   Huawei  2011      H1
# 1                     H2
# 2   Huawei  2018      H3
# 5  Samsung  2018      S1
# 6  Samsung  2019      S2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...