簡體   English   中英

如何使用for循環在pandas數據框中的現有列上創建條件列

[英]How to create new column conditional on existing columns in pandas dataframe using for loop

我有一個包含兩列的數據集,我想創建第三列,該列說明前兩列的值是否相同,並為每行命名相同的值。

示例數據:

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.將boolean數組的“ 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,因此先前顏色匹配(紅色和藍色)的匹配行上的信息會丟失,並且僅顯示綠色。 我希望以三列成對匹配(即每次循環運行添加/追加列)結束,然后將它們合並到我想要的單個列中。 非常感謝。

numpy.where與boolean mask比較兩列:

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

一個更簡單的方法可能是:

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

這將創建一個充滿False的列,然后在各列之間顏色匹配的地方,將它們替換為color的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM