Этот вопрос на самом деле о 2 случаях:
- сделать такое же значение в столбце информационного кадра pandas пустым
- сохранить результирующий фрейм данных, чтобы превзойти его с объединенной ячейкой, а текст находится по центру по вертикали
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
спасибо