Python Pandas合并行并使用第二个df转换数据

时间:2017-06-01 06:37:28

标签: python pandas dataframe

我有两个dfs,一个是数据,另一个是"键"取代。我想继续"键" df,如果密钥存在于数据df中,那么在数据df中,更改为键的值并对行进行一些合并。

所以例如,这是数据df:

    col1 col2 col3  total total_col1 total_col2
bbb    V    V    X      2        DF1        DF2
ccc    V    X    X      1        DF1           
zzz    X    V    V      2                   DF2
qqq    X    V    X      1                      
rrr    X    V    V      2       DF1, DF2    

这是"键" DF:

key      value
bbb       b value
zzz       z value
qqq       ----
rrr       b value

因此输出值将合并具有相同值的行(bbb和rrr相同的值),如果值为' ----'然后数据将是相同的,如果没有密钥,那么数据也将是相同的。所以输出是:

         col1 col2 col3  total    total_col1      total_col2
b value    V    V    V      3        DF1, DF2        DF2
ccc        V    X    X      1        DF1           
z value    X    V    V      2                        DF2
qqq        X    V    X      1                      

这可能与熊猫有关吗?

3 个答案:

答案 0 :(得分:1)

答案是肯定的。假设您有以下dataframe作为df1

>>> df1 = pd.DataFrame({'key':['aaa','bbb','ccc','ddd']})
>>> df1
   key
0  aaa
1  bbb
2  ccc
3  ddd

然后你有另一个dataframe,它是名为df2的参考表。

>>> df2
   key  value
0  aaa  value a
1  ccc  value c

为了获得以下结果,

>>> result
   key
0  value a
1  bbb
2  value c
3  ddd

您必须merge然后fillna NaN

>>> df1['key'] = df1.merge(df2, on=['key'], how='left')['value'].fillna(value=df1.key, axis=0)
>>> df1
   key
0  value a
1  bbb
2  value c
3  ddd

其他

如果key中的df1位于索引中,则您可以使用reset_indexindex转换为column。例如,

>>> df = pd.DataFrame(data={'col1':['val1','val2','val3']}, index=['aaa','bbb','ccc'])
>>> df
    col1
aaa val1
bbb val2
ccc val3
>>> df.reset_index().rename(columns={'index':'key'})
    key  col1
0   aaa  val1
1   bbb  val2
2   ccc  val3

答案 1 :(得分:0)

您可以使用名为update的pandas Dataframe函数。可以找到here的文档。

您可以通过以下方式使用密钥更新数据框df

df.update(keys_df)

但在此之前,请确保keys列是keys_df datafrane的索引,然后才能使用。

希望这会有所帮助。快乐的编码。 干杯!

答案 2 :(得分:0)

以下可能适合您。

# getting the row index of df
df_index = df.index

# getting the row index of keys
keys_index = keys.index

# for those indices existing in keys, we rename the coresponding ones in df
for i in keys_index:
    if i in df_index and keys[i]:
            df.rename(index={i: keys[i]})