簡體   English   中英

在熊貓中遍歷數據框的行並更改值

[英]Iterating over rows of a dataframe in pandas and changing values

我的問題涉及遍歷數據幀的行,並在每一行上基於不同數據幀中的信息設置一個字段。 抱歉,這是一個基本問題,但是我在論壇上一直沒有成功。

我有兩個數據框,分別稱為sample和lvlslice。 我的樣本上沒有索引的名稱(似乎在隨機挑選一些條目的過程中迷失了方向)。 對於樣本中的每一行,我試圖對lvlslice條目的數量字段求和,其fbid與我的索引匹配,並將結果放入new_col中。

我可以通過一些笨拙的循環來做到這一點,從索引的列表中列出等等,這似乎很簡單。我的主要問題是如何遍歷樣本數據框的循環,然后基於行的內容?

任何幫助,將不勝感激。 我對執行這樣的操作的正確方法特別感興趣,而不僅僅是獲得我的總和。

print(sample)

         purchase   new_col
43022    True       0
3423     True       0
43534    True       0

print(lvlslice)

                             fbid   other_stuff  amount
timestamp               
2014-01-03 00:00:10.328000   3424   stuff        320
2014-01-03 00:00:21.419000   5557   stuff        360
2014-01-03 00:00:22.667000   3424   stuff        7000
...

編輯:感謝您的出色答復,這不僅對眼前的問題很有用。

您可以使用mergegroupby做到這一點。 參見下文,我修改了您的一些數據以在列中獲取匹配值,以更好地顯示結果。

import pandas as pd

sample = pd.DataFrame({"purchase": True, "new_col": 0},
                      index=[43022, 3424, 43534])

lvlslice = pd.DataFrame({'fbid': [3424, 43534, 3424], 'other_stuff': 'stuff',
                         'amount': [320, 360, 7000]})

df = pd.merge(lvlslice, sample, left_on='fbid', right_index=True)

print df.groupby('fbid')['amount'].sum()

打印:

fbid
3424     7320
43534     360
Name: amount, dtype: int64

這是我的第一篇文章,所以如果代碼出來的格式很奇怪,對不起!

我認為這正是您所要的,但是它既昂貴又昂貴。 對於像這樣的普通事情,幾乎總是有一種優雅的方法來完成已經內置在大熊貓中的工作。

import pandas as pd

sample = pd.DataFrame({"purchase": True, "new_col": 0},index=[43022, 3424, 43534])
lvlslice = pd.DataFrame({'fbid': [3424, 43534, 3424], 'other_stuff': 'stuff','amount': [320, 360, 7000]})
sample['total'] = 0

for sampleindex in sample.index:
    for lvlsliceindex in lvlslice.index:
    amount = lvlslice.ix[lvlsliceindex]['amount']
    if sampleindex == lvlslice.ix[lvlsliceindex]['fbid']:
        sample.loc[sampleindex,'total'] += amount

print sample['total']

輸出:

43022       0
3424     7320
43534     360
Name: total, dtype: int64

但是,請不要使用香蕉魚的代碼。

代替:

print df.groupby('fbid')['amount'].sum()

您可以從以下獲得相同的結果:

df.groupby('fbid').agg('sum')['amount']

如果要保留樣本中的行總數為零,則可以執行以下合並:

df = pd.merge(lvlslice, sample, left_on='fbid', right_index=True,how='outer').fillna(0)

暫無
暫無

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

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