Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 如果数据帧的大小不同,则将第一个数据帧的列指定给第二个数据帧_Pandas - Fatal编程技术网

Pandas 如果数据帧的大小不同,则将第一个数据帧的列指定给第二个数据帧

Pandas 如果数据帧的大小不同,则将第一个数据帧的列指定给第二个数据帧,pandas,Pandas,假设我有两个数据帧: 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

假设我有两个数据帧:

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
temp
id
不匹配,则分配NA)到常规中?一般来说,我指的是这样的情况,例如,
id
column是名称,它们不像数字那样排序。如何在pandas中执行此操作?

首先在
df1
中默认使用
NA
指定一列。接下来,对于
df1
中的每一行,获取
行的
id
值,并查看
id
是否在
temp
数据帧中。如果它返回非空,则使用从
temp
返回的第一个值为
df1
的相应行赋值。您可以尝试以下操作:(np指numpy)


让我问几个问题:1)val_df=temp.loc[temp['id']==row['id']]这一行同时比较(真或假)row['id']和temp['id']的每个值?2) df1.loc[index,'val']=val_df['val'].这里的值[0]您能解释一下为什么我们需要从RHS对值[0]进行编码吗?@Mat_nekras For
1)
是的,比较后会有
True或False
。对于
2)
val\u df['val']
返回
Series
,因此,
.values
将其更改为
ndarray
。values[0]
,从数组中拾取第一个元素。可能还有其他的替代方法和有效的方法。只有一个问题出现了:当id值为stings时,代码不起作用。我说,索引应该是整数或切片,而不是字符串
# 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]