簡體   English   中英

如何基於其他兩列創建新的 dataframe 列?

[英]How do I create a new dataframe column based on two other columns?

如果下表中兩列的值在同一范圍內,我想創建一個表示 1 的二進制列。 例如,如果 cat_1 的值在 5-10 之間,而 cat_2 的值也在 5-10 之間,則應指示 1,否則應為 0。

| cat_1.   | cat_2.         | [5-10] (new column to be created|
| -------- | -------------- | --------------------------------|
| 5        | 10             |1.                               |
| 7        | 9.             |1                                |
| 1        | 7.             |0                                |

到目前為止,我已經嘗試了以下代碼,但它返回錯誤:

df.loc[((df['cat_1l'] >= 5 & df['cat_1'] <= 10) 
       & (df['cat_2'] >= 5 & result['cat_2'] <= 10)), '[5-10]' = 1

這是錯誤:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

pandas 使用按位運算 (& |) 並且每個條件都應該用括號括起來,否則會引發錯誤。

嘗試用 () 包裝每個條件,例如(df['cat_1l'] >= 5) & (...)以查看錯誤是否消失。

但是,您的操作可以在 function between進行簡化。

df['[5-10]'] = (df.cat_1.between(5, 10) & df.cat_2.between(5, 10)).astype(int)

您收到錯誤的原因是&的評估優先於>= 要修復您的代碼段,請在列比較周圍添加括號:

df.loc[((df['cat_1l'] >= 5) & (df['cat_1'] <= 10) 
       & (df['cat_2'] >= 5) & (result['cat_2'] <= 10)), '[5-10]' = 1

更好的是,最好將新列定義為一個整體,而不使用.loc進行子集化。 考慮例如:

df['[5-10]'] = df['cat1'].between(5, 10) & df['cat_2'].between(5, 10)

在這種情況下,您還可以使用apply()根據其他列創建一個新列。

在這里,我傳遞了 cat_1 和 cat_2 兩列的值來創建一個新列,如下所示:

import pandas as pd

df = pd.DataFrame(
    {
        'cat_1': [5, 7, 1],
        'cat_2': [10, 9, 7],
    }
)


def check_in_range(x):
    cat_1, cat_2 = x
    start = 5
    end = 10
    if (start <= cat_1 <= end) and (start <= cat_2 <= end):
        return 1
    else:
        return 0

df['new'] = df[['cat_1', 'cat_2']].apply(check_in_range, axis=1)

print(df)
#   cat_1  cat_2  new
#0      5     10    1
#1      7      9    1
#2      1      7    0

暫無
暫無

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

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