У меня есть Dataframe, который имеет несколько столбцов, в которых некоторые столбцы равны (тот же ключ в конце, например: column1 = 'a / first', column2 = 'b / first'). Я хочу объединить эти две колонки. Пожалуйста, помогите мне решить проблему.
Мой Dataframe выглядит как
name g1/column1 g1/column2 g1/g2/column1 g2/column2
AAAA 10 20 nan nan
AAAA nan nan 30 40
Мой результат будет таким
name g1/column1 g1/column2
AAAA 10 20
AAAA 30 40
заранее спасибо
Это невозможно. у одного должно быть одно значение. и другие нан






Одно из решений:
df = pd.DataFrame([[10, 20, np.nan, np.nan],
[np.nan, np.nan, 30, 40]],
columns=['g1/column1', 'g1/column2', 'g1/g2/column1', 'g2/column2'])
df
g1/column1 g1/column2 g1/g2/column1 g2/column2
0 10.0 20.0 NaN NaN
1 NaN NaN 30.0 40.0
df = df.fillna(0) # <- replacing all NaN with 0
ndf = pd.DataFrame()
unique_cols = ['column1', 'column2']
for i in range(len(unique_cols)):
val = df.columns[df.columns.str.contains(unique_cols[i])]
ndf[val[0]] = df.loc[:,val].sum().reset_index(drop=True)
ndf # <- You can add index if you need (AAAA, AAAA)
g1/column1 g1/column2
0 10.0 20.0
1 30.0 40.0
import pandas as pd
import numpy as np
g1 = [20, np.nan, 30, np.nan]
g1_2 = [10, np.nan, 20, np.nan]
g2 = [np.nan, 30, np.nan, 40]
g2_2 = [np.nan, 10, np.nan, 30]
dataList = list(zip(g1, g1_2, g2, g2_2))
df = pd.DataFrame(data = dataList, columns=['g1/column1', 'g1/column2', 'g1/g2/column1', 'g2/column2'])
df.fillna(0, inplace=True)
df['g1Combined'] = df['g1/column1'] + df['g1/g2/column1']
df['g2Combined'] = df['g1/column2'] + df['g2/column2']
df.drop('g1/column1', axis=1, inplace=True)
df.drop('g1/column2', axis=1, inplace=True)
df.drop('g1/g2/column1', axis=1, inplace=True)
df.drop('g2/column2', axis=1, inplace=True)
df
вам нужен df.combine_first,
col1=['g1/column1', 'g1/column2']
col2=['g1/g2/column1', 'g2/column2']
df[col1]=df[col1].combine_first(pd.DataFrame(df[col2].values,columns=col1))
df=df.drop(col2,axis=1)
print(df)
# name g1/column1 g1/column2
#0 AAAA 10.0 20.0
#1 AAAA 30.0 40.0
Если у меня есть другой столбец g1 / g2 / g3 / column1, он не будет добавлен в g1 / column1.
Использовать:
#create index by all columns with no merge
df = df.set_index('name')
#MultiIndex by split last /
df.columns = df.columns.str.rsplit('/', n=1, expand=True)
#aggregate first no NaN values per second level of MultiIndex
df = df.groupby(level=1, axis=1).first()
print (df)
column1 column2
name
AAAA 10.0 20.0
AAAA 30.0 40.0
красивое и маленькое решение. Однако, если вы можете дать больше объяснений, это будет здорово. Как для df = df.groupby (level = 1, axis = 1) .first ()
Если столбец без разделителя ('/'). он проигнорирует эти столбцы. Как этого избежать?
@MOHAMEDAZARUDEEN - Есть какое-то правило для группировки? Что такое print (df.columns)?
[u'Additional_type_of_g_business_enterprise ', u'version', u'_attachments ', u'formhub / uuid', u'group_bf8zc97 / Female ', u'group_bf8zc97 / Female », u'group_bf8zc97 / To', u'groupses_b , u'group_gu8hn21 / CIG_expenses ', u'group_gu8hn22 / group_gu8hn20 / CIG_expenses']
@MOHAMEDAZARUDEEN - Спасибо. Итак, какие столбцы нужно объединить вместе? Я не вижу ваших реальных данных, поэтому мне нужно сопоставление типа u'village',u'county', ...=> u'village_code',u'sub_county' ... (возможно, я ошибся с этим сопоставлением, при необходимости исправьте его, а также добавьте имена всех столбцов для обеих сторон)
что, если оба столбца имеют значение для одной и той же строки?