如何使用 Python 合并或使用字符串连接两个熊猫数据框

Posted

技术标签:

【中文标题】如何使用 Python 合并或使用字符串连接两个熊猫数据框【英文标题】:How to use Python merge or join two pandas dataframe with string 【发布时间】:2018-10-18 14:52:53 【问题描述】:

我想合并两个数据框的数据。数据框是字符串

df1=pd.read_csv('test1.csv',encoding='utf8',index_col=['id_df1'],header=0)
df2=pd.read_csv('test2.csv',encoding='utf8',index_col=['id_df2'],header=0)
print(df1)
print(df2)

out:
id_df1  student  contact_person
1       john     Amy
2       jeff     Cindy
3       steven   Bob
4       tina     Amy


id_df2  student  parents_list
1       tina     (Amy) (Bob)
2       steven   (Eric) (Bob)
3       john     (Amy)
4       jeff     (Frank) (Harry)

print(type(df1['contact_person'][0]))
print(type(df2['parents_list'][0]))

out:
<class 'str'>
<class 'str'>

如果 df1['student']==df2['student'] & df1['contact_person'] 匹配 df2['parents_list'] 我想使用这样的“外部”方法:

output

    id_df1 id_df2 student contact_person parents
0   1      3      john    Amy            (Amy)
1   3      2      steven  Bob            (Eric) (Bob)
2   4      1      tina    Amy            (Amy) (Bob)
3   2      null   jeff    Cindy          null
4   null   4      jeff    null           (Frank) (Harry)

【问题讨论】:

为什么 jeff 在结果中?我在 parents_list 中没有看到“c”。 我想用“外层” 我更新了我的问题,谢谢 【参考方案1】:

一种方法是:首先在您的df1 中,如果满足您的条件,则创建一个列bool

df1['bool'] = df1.apply(lambda row: True if row['contact_person'] in df2['parents_list'][df2['student'] == row['student']].iloc[0] else False,1)

那么你可以merge满足条件的df_yes和不满足条件的appenddf_no

df_yes = df1[df1['bool'] == True].\
         merge(df2, on='student', how = 'left').drop('bool',1)
df_no = df1[df1['bool'] == False].\
        append(df2[df2['student'].isin(df1['student'][df1['bool'] == False])]).drop('bool',1)

最后只是append两者:

list_ordered_col = ['id_df1', 'id_df2', 'student', 'contact_person', 'parents_list']
df_output = df_yes.append(df_no)[list_ordered_col ].\
            reset_index(drop=True)

注意:它正在使用您之前对 parent_list 的输入(当它是 a、b、c...时)

编辑:将df1['bool']=... 替换为:

def parantes_in_parentList (row, df_list):
    df_parent_list = df_list['parents_list'][df_list['student'] == row['student']]
    if not df_parent_list.empty:
        if row['contact_person'] in df_parent_list.iloc[0]:
            return True
    # return False in all the other case
    return False
df1['bool'] = df1.apply(parantes_in_parentList , args=([df2]),axis=1)

【讨论】:

如果输入的是真实姓名(如:Amy,Bob,Cindy),我的代码怎么写 @Steven 它可以以相同的方式工作,它更多的是 parents_list 列,它应该是一个列表(或可迭代)。您是否尝试过使用名称和新输入? 是的,但是当我执行此代码“df1['bool'] = df1.apply(lambda row: True if row['contact_person'] in df2['parents_list'][df2['student'] == row['student']].iloc[0] else False,1)" @Steven 这里我假设问题是df2['parents_list'][df2['student'] == row['student']] 可能是空的(这与您显示的输入是意外的)并且执行.iloc[0] 会引发错误。我会在一分钟内进行编辑以防止这种情况发生

以上是关于如何使用 Python 合并或使用字符串连接两个熊猫数据框的主要内容,如果未能解决你的问题,请参考以下文章

使用python中的两个数字合并或连接两个数据集

如何在 Python 中合并两个 json 字符串?

python文本 拼接或合并字符串

使用 pandas 追加、连接、连接或合并两个数据框

Python:两个数据帧的外部连接或合并给出错误:TypeError:unhashable type:'numpy.ndarray'

如何通过在 Python 中将两个列表合并为一个,使用 CSV 模块或 Pandas 写入 csv 或 Excel 文件?