簡體   English   中英

熊貓:基於列數據合並或聯接數據框?

[英]Pandas: Merge or join dataframes based on column data?

我試圖將幾列數據添加到現有數據框。 數據框本身是由許多其他數據框構建而成的,我在相同的索引上成功加入了這些數據框。 為此,我使用了如下代碼:

    data = p_data.join(r_data)

我實際上是在多索引上加入這些的,因此數據框看起來如下所示,其中Name1和Name 2是索引:

    Name1    Name2    present    r      behavior
    a        1        1          0      0
             2        1          .5     2
             4        3          .125   1
    b        2        1          0      0
             4        5          .25    4
             8        1          0      1

因此,Name1索引不會重復數據,但是Name2索引會重復(我使用它來跟蹤dyad,因此Name1和Name2在一起只能表示一次)。 我現在要添加的是與Name2數據相對應的4列數據(有關dyad的第二個成員的信息)。 與“當前”,“ r”和“行為”數據不同,這些數據是按個人而不是按對偶。 因此,合並時無需考慮Name1數據。

問題是,雖然重復Name2數據以耗盡合並組合,但我現在想添加的數據中的“ Name2”列僅對每個Name2個人包含一個數據:

    Name2    Data1    Data2    Data3
    1        80       6        1
    2        61       8        3
    4        45       7        2
    8        30       3        6

我希望輸出看起來像什么:

    Name1    Name2    present    r      behavior    Data1    Data2    Data3
    a        1        1          0      0           80       6        1
             2        1          .5     2           61       8        3
             4        3          .125   1           45       7        2
    b        2        1          0      0           61       8        3
             4        5          .25    4           45       7        2
             8        1          0      1           30       3        6

盡管閱讀了文檔,但不清楚是否可以使用join()或merge()獲得所需的結果。 如果嘗試像以前使用的簡單連接那樣嘗試連接到現有數據框,則會得到新的列,但它們充滿了NaN值。 我還嘗試了使用Name1和Name2作為列或索引的各種組合,並使用了join或merge(聽起來不像是隨機的,但是我顯然沒有正確解釋文檔!)。 您的幫助將不勝感激,因為我目前非常迷失。

我不知道這是否是最好的方式,但你可以使用reset_index暫時使你的原始數據幀由索引Name2只。 然后,您可以照常執行join 然后使用set_index再犯Name1對多指標的一部分:

import pandas as pd

df = pd.DataFrame({'Name1':['a','a','a','b','b','b'],
                   'Name2':[1,2,4,2,4,8],
                   'present':[1,1,3,1,5,1]})
df.set_index(['Name1','Name2'], inplace=True)

df2 = pd.DataFrame({'Data1':[80,61,45,30],
                    'Data2':[6,8,7,3]},
                   index=pd.Series([1,2,4,8], name='Name2'))
result = df.reset_index(level=0).join(df2).set_index('Name1', append=True)
print(result)
#              present  Data1  Data2
# Name2 Name1                       
# 1     a            1     80      6
# 2     a            1     61      8
#       b            1     61      8
# 4     a            3     45      7
#       b            5     45      7
# 8     b            1     30      3

為了使結果看起來更像您想要的DataFrame,可以對索引重新排序和排序:

print(result.reorder_levels([1,0],axis=0).sort(axis=0))
#              present  Data1  Data2
# Name1 Name2                       
# a     1            1     80      6
#       2            1     61      8
#       4            3     45      7
# b     2            1     61      8
#       4            5     45      7
#       8            1     30      3

暫無
暫無

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

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