[英]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
...
編輯:感謝您的出色答復,這不僅對眼前的問題很有用。
您可以使用merge和groupby做到這一點。 參見下文,我修改了您的一些數據以在列中獲取匹配值,以更好地顯示結果。
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.