[英]Extracting/appending pandas dataframe rows which meet a complex condition involving multiple columns
我無法理解循環數據框的工作原理。
如果你寫的話,我找到了某個地方:
for row in df.iterrows()
你將無法訪問row ['column1'],而你必須使用
for row,index in df.iterrows()
然后它可以工作。
現在我想創建一個我在循環中找到的信號集合,通過向新數據幀newdf.append(row)
添加行,這可以工作,但它失去了字符串引用的能力。 我如何將這些行添加到我的數據框中才能使其工作?
詳細代碼:
dataframe1 = DataFrame(np.random.randn(10, 5), columns=['a','b','c', 'd', 'e'])
dataframe2 = DataFrame()
for index,row in dataframe1:
if row['a'] == 5
dataframe2.append(row)
print dataframe2['b']
這不起作用,因為他不接受數據框2的括號內的字符串。 是的,這可以做得更容易,但為了爭論,我們可以說它不能(比一個更復雜的邏輯)。
在我的真實代碼中,有十個不同的ifs和elses確定如何處理該特定行(並在循環中執行其他操作)。 我不是在談論過濾,而只是以一種保護索引的方式將行添加到新數據框中,以便我可以使用列的名稱進行引用
在pandas
,過濾並將結果(如果需要)傳遞給新數據幀非常簡單,就像@smci建議的r
。
import numpy as np
import pandas as pd
dataframe1 = pd.DataFrame(np.random.randn(10, 5), columns=['a','b','c', 'd', 'e'])
dataframe1.head()
a b c d e
0 -2.824391 -0.143400 -0.936304 0.056744 -1.958325
1 -1.116849 0.010941 -1.146384 0.034521 -3.239772
2 -2.026315 0.600607 0.071682 -0.925031 0.575723
3 0.088351 0.912125 0.770396 1.148878 0.230025
4 -0.954288 -0.526195 0.811891 0.558740 -2.025363
然后,要進行過濾,您可以這樣做:
dataframe2=dataframe1.ix[dataframe1.a>.5]
dataframe2.head()
a b c d e
0 0.708511 0.282347 0.831361 0.331655 -2.328759
1 1.646602 -0.090472 -0.074580 -0.272876 -0.647686
8 2.728552 -0.481700 0.338771 0.848957 -0.118124
編輯
OP不想使用過濾器,所以這里是一個迭代遍歷行的示例:
np.random.seed(123)
dataframe1 = pd.DataFrame(np.random.randn(10, 5), columns=['a','b','c', 'd', 'e'])
## I declare the second df with the same structure
dataframe2 = pd.DataFrame(columns=['a','b','c', 'd', 'e'])
對於循環我使用iterrows
,而不是append
到空數據幀,我使用迭代器中的索引放置在空幀中的相同索引位置。 請注意,我說> .5
而不是= 5
,否則結果數據框肯定是空的。
for index, row in dataframe1.iterrows():
if row['a'] > .5:
dataframe2.loc[index] = row
dataframe2
a b c d e
1 1.651437 -2.426679 -0.428913 1.265936 -0.866740
4 0.737369 1.490732 -0.935834 1.175829 -1.253881
更新:
別。 解決方案是:
dataframe1[dataframe1.a > .5]
# or, if you only want the 'b' column
dataframe1[dataframe1.a > .5] ['b']
您只想過濾a == 5的行(然后選擇b列?)您仍然沒有顯示為什么需要追加到dataframe1的原因。 實際上,您不需要附加任何內容,只需直接生成過濾后的版本即可。
原始版本:
別。
如果您只想計算聚合或摘要,並且它們並不真正屬於父數據幀,請執行過濾。 將結果分配給單獨的數據幀。
如果你真的堅持使用iterate + append,而不是過濾器,甚至知道所有警告,那么創建一個空的摘要數據幀,然后在迭代時附加到它。 只有在完成迭代后,才將其附加(並且僅在您確實需要時),返回到父數據幀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.