Как создать новый столбец в зависимости от существующих столбцов в панде, используя цикл for - PullRequest
0 голосов
/ 04 октября 2018

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

Пример данных:

import pandas as pd

data = {'Colour_mix': ['1','2', '3', '4', '5', '6', '7', '8', '9', '10'], 
        'Colour_1': ['red', 'blue', 'red', 'red', 'green', 'green', 'green', 'red', 'blue', 'blue'],
        'Colour_2': ['red', 'green', 'red', 'blue', 'green', 'red', 'green', 'red', 'green', 'blue'] }
df1 = pd.DataFrame(data)
cols = ['Colour_mix', 'Colour_1', 'Colour_2']
df1 = df1[cols] 
df1

То, что я хочу получить в итоге, выглядит следующим образом:

data2 = {'Colour_mix': ['1','2', '3', '4', '5', '6', '7', '8', '9', '10'], 
        'Colour_1': ['red', 'blue', 'red', 'red', 'green', 'green', 'green', 'red', 'blue', 'blue'],
        'Colour_2': ['red', 'green', 'red', 'blue', 'green', 'red', 'green', 'red', 'green', 'blue'],
        'Pairwise_match': ['red', 'False', 'red', 'False', 'green', 'False', 'green', 'red', 'False', 'blue']}
df2 = pd.DataFrame(data2)
cols2 = ['Colour_mix', 'Colour_1', 'Colour_2', 'Pairwise_match']
df2 = df2[cols2] 
df2 

то есть добавляется новый столбец, в котором указывается, во-первых, когда совпадают столбцы Colour_1 и Colour_2, а во-вторых, что является общимзначение (красный, синий или зеленый).

До сих пор мой подход заключался в создании упорядоченного набора логических массивов для совпадения столбцов Colour_1 и Colour_2, и я надеялся создать цикл, который итеративно:1. Изменили «True» логического массива на значение совпадения, т.е. красного, синего или зеленого, и 2. Объедините полученные совпадения в один столбец.

Мой код до сих пор:

# Create a list of boolean arrays for each match pair
colour_matches = collections.OrderedDict()

colour_matches['red'] = ( (df1['Colour_1']=='red')
                      & (df1['Colour_2']=='red')
                      )

colour_matches['blue'] = ( (df1['Colour_1']=='blue')
                      & (df1['Colour_2']=='blue')
                      )

colour_matches['green'] = ( (df1['Colour_1']=='green')
                      & (df1['Colour_2']=='green')
                      )

# Add pairwise match columns

for p in colour_matches:
    print(p)
    _matches_df = pd.DataFrame(colour_matches[p])
    _matches_df.columns = ['Pairwise_match']
    df_new = pd.concat([df1, _matches_df], axis=1)

У меня две проблемы: 1. Я не могу понять, как изменить значение логических массивов в цикле, чтобы «True» условно заменялось общим значениемиз двух цветных столбцов (красный, синий или зеленый).2. Мой цикл в настоящее время перезаписывает Pairwise_match в каждом цикле, поэтому информация о соответствующих строках для предыдущих совпадений цветов (красного и синего) теряется и отображается только зеленым цветом.Я надеялся получить три столбца парных совпадений (то есть добавить / добавить столбцы при каждом запуске цикла), которые затем я мог бы объединить в один желаемый столбец.Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Более простой подход может быть следующим:

df1["Pairwise_match"] = False
df1.loc[df1.Colour_1 == df1.Colour_2, "Pairwise_match"] = df1.Colour_1[df1.Colour_1 == df1.Colour_2]

Это создаст столбец, полный False, а затем, когда цвета совпадают между столбцами, замените их значением цвета

0 голосов
/ 04 октября 2018

Использование numpy.where с логической маской для сравнения обоих столбцов:

df1['Pairwise_match'] = np.where(df1['Colour_1'] == df1['Colour_2'], df1['Colour_1'], False)
print (df1)
  Colour_mix Colour_1 Colour_2 Pairwise_match
0          1      red      red            red
1          2     blue    green          False
2          3      red      red            red
3          4      red     blue          False
4          5    green    green          green
5          6    green      red          False
6          7    green    green          green
7          8      red      red            red
8          9     blue    green          False
9         10     blue     blue           blue

Деталь:

print (df1['Colour_1'] == df1['Colour_2'])
0     True
1    False
2     True
3    False
4     True
5    False
6     True
7     True
8    False
9     True
dtype: bool
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...