簡體   English   中英

將過濾后的數據幀行的值設置為等於另一個數據幀的列

[英]Setting the values of filtered rows of dataframe equal to the column of another dataframe

我有一個數據df1

df1 = pd.DataFrame([['a','Yes','abc def msg1'],
                    ['b', 'No', 'ghi jkl msg2'],
                    ['c','Yes','mno pqr msg3'],
                    ['d', 'No', 'stu vwx msg4'],
                    ['a', 'Yes', 'bcd efg msg5'],
                    ['c','No','hij klm msg6'],
                    ['a','No','nop qrs msg7'],
                    ['b','No','tuv wxy msg8']],
                  columns=['unit_name','is_required','dummy_column'])

unit_name   is_required dummy_column
    a            Yes    abc def msg1
    b             No    ghi jkl msg2
    c            Yes    mno pqr msg3
    d             No    stu vwx msg4
    a            Yes    bcd efg msg5
    c             No    hij klm msg6
    a             No    nop qrs msg7
    b             No    tuv wxy msg8

具有 unit_name = 'a' 和 is_required='Yes' 的行用於派生另一個數據幀df2

dummy1  dummy2  msg_column  value
abc      def    msg1        val1
bcd      efg    msg5        val2

現在我想將df2的值列添加到df1 沒有值的行必須包含“-”。 所以我想要的預期輸出是:

unit_name   is_required dummy_column    value
    a            Yes    abc def msg1    val1
    b             No    ghi jkl msg2    -
    c            Yes    mno pqr msg3    -
    d             No    stu vwx msg4    -
    a            Yes    bcd efg msg5    val2
    c             No    hij klm msg6    -
    a             No    nop qrs msg7    -
    b             No    tuv wxy msg8    -

為了做到這一點,我嘗試了以下代碼行:

df1.loc[(df1.unit_name=='a') & (df1.is_required=='Yes'),'value'] = df2['value']
df1.fillna('-')

但我得到了結果:

unit_name   is_required dummy_column    value
    a            Yes    abc def msg1    val1
    b             No    ghi jkl msg2    -
    c            Yes    mno pqr msg3    -
    d             No    stu vwx msg4    -
    a            Yes    bcd efg msg5    -
    c             No    hij klm msg6    -
    a             No    nop qrs msg7    -
    b             No    tuv wxy msg8    -

現在我明白這是因為在等同於兩列時,LHS 的索引值將用於從 RHS 獲取值。

我如何獲得我需要的輸出? 歡迎任何想法。 提前致謝!

問題是兩個 DataFrame 中有不同的索引。

如果過濾的行數與df2行數相同,則可能的解決方案:

print (((df1.unit_name=='a') & (df1.is_required=='Yes')).sum(), len(df2.index))

然后是可能的用途:

df1.loc[(df1.unit_name=='a') & (df1.is_required=='Yes'),'value'] = df2['value'].to_numpy()

暫無
暫無

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

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