2017-06-24 67 views
1

假設我有2個數據幀:分配第一數據幀的柱到第二個,如果數據幀具有不同的尺寸

df1 = pd.DataFrame(np.arange(0,301),columns = ['id']) 
df2 = pd.DataFrame(np.arange(200,387),columns = ['id']) 

df1['2'] = np.random.randint(0,2,301) 
df2['2'] = np.random.randint(0,2,187) 

然後我匹配ID的從第二數據幀到第一和創建第三DF:

temp = df2.loc[df2['id'].isin(df1['id'])] 

然後,我計算了一些值:

def values_14(row): 
    if row['2'] == 1: 
     return 1 
    else: 
     return 0 


temp['val'] = temp.apply(lambda row: values_14(row),axis = 1) 

我的問題是:如何從賦值數據幀temp的列val到第一個數據幀(如果第一個數據幀中的id不匹配到tempid,則分配NA)通用?一般來說,我的意思是這種情況,例如,id列是名稱,它們不像數字那樣排序。我如何在熊貓中做到這一點?

回答

1

默認情況下,首先爲df1分配一列NA。接下來爲df1中的每一行得到id值爲row,看看是否相同idtempdataframe。如果它返回非空,則分配相應的行df1和從temp返回的第一個值。您可以嘗試以下幾種:(NP指numpy的

# setting empty nan column for 'val' in df1 
df1['val'] = np.nan 

# iterate through each row in df1 
for index, row in df1.iterrows(): 
    # look for corresponding rows in temp dataframe 
    # that matches id of current row of df1 
    val_df = temp.loc[temp['id'] == row['id']] 
    # if id matched in temp then it will return non-empty 
    if not val_df.empty: 
     # assign corresponding row of df1 with first value 
     # of temp which where id matched 
     df1.loc[index, 'val'] = val_df['val'].values[0] 
+0

讓我問了幾個問題: 1)val_df = temp.loc [溫度[ '身份證'] ==行[ '身份證' ]]這一行在同一時間比較(True False)行['id']與temp ['id']的每個值? 2)df1.loc [index,'val'] = val_df ['val']。values [0] here can can please please me me why we need need to code values [0] from RHS? –

+0

@Mat_nekras對於'1)'是的,比較後它會有'True或False'。對於'2)','val_df ['val']'返回'Series',所以'.values'將它改爲'ndarray'和'.values [0]',從數組中選擇第一個元素。可能還有其他選擇和有效的方法。 – 0p3n5ourcE

+0

只有一個問題出現:當id值爲stings時,代碼不起作用。我說,索引應該是整數或切片,但不是字符串 –

相關問題