Объедините два столбца в пандах DataFrame

У меня есть 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      

заранее спасибо

что, если оба столбца имеют значение для одной и той же строки?

Pratham 06.12.2018 06:02

Это невозможно. у одного должно быть одно значение. и другие нан

MOHAMED AZARUDEEN 06.12.2018 06:05
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
1 139
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Одно из решений:

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.

MOHAMED AZARUDEEN 07.12.2018 07:07
Ответ принят как подходящий

Использовать:

#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 ()

Rishi Bansal 06.12.2018 08:16

Если столбец без разделителя ('/'). он проигнорирует эти столбцы. Как этого избежать?

MOHAMED AZARUDEEN 10.12.2018 08:12

@MOHAMEDAZARUDEEN - Есть какое-то правило для группировки? Что такое print (df.columns)?

jezrael 10.12.2018 08:14

[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']

MOHAMED AZARUDEEN 10.12.2018 08:24

@MOHAMEDAZARUDEEN - Спасибо. Итак, какие столбцы нужно объединить вместе? Я не вижу ваших реальных данных, поэтому мне нужно сопоставление типа u'village',u'county', ...=> u'village_code',u'sub_county' ... (возможно, я ошибся с этим сопоставлением, при необходимости исправьте его, а также добавьте имена всех столбцов для обеих сторон)

jezrael 10.12.2018 08:29

Другие вопросы по теме