Python 根据起始字母表,在两个数据帧的列之间执行完全合并

Python 根据起始字母表,在两个数据帧的列之间执行完全合并,python,pandas,Python,Pandas,我想在两个不同数据帧的两列(名称)的值之间执行完全合并。只能在以相同字母开头的名称之间进行合并。例如,ABC应与以字母“A”开头的其他数据框的所有名称合并。所有字母“A”到“Z”都应该这样做。我正在编写以下代码。但完全合并的长度显示为0。我还想将基于每个字母合并后得到的结果附加到一个新的数据帧中。我应该做什么改变?这是我的密码- for c in ascii_uppercase: df1 = df1[df1.Name.str[0] == c ].copy() df2 = df2[

我想在两个不同数据帧的两列(名称)的值之间执行完全合并。只能在以相同字母开头的名称之间进行合并。例如,ABC应与以字母“A”开头的其他数据框的所有名称合并。所有字母“A”到“Z”都应该这样做。我正在编写以下代码。但完全合并的长度显示为0。我还想将基于每个字母合并后得到的结果附加到一个新的数据帧中。我应该做什么改变?这是我的密码-

for c in ascii_uppercase:
    df1 = df1[df1.Name.str[0] == c ].copy()
    df2 = df2[df2.Name.str[0] == c].copy()
    df1['Join'] =1
    df2['Join'] =1
    FullMerge = pd.merge(df2,df1, left_on='Join',right_on='Join')
    len(FullMerge)

我会在上面创建一列“FirstLetter”和
[merge][1]

import pandas as pd
import numpy as np
from string import ascii_uppercase

df1 = pd.DataFrame(np.random.choice(list(ascii_uppercase), (5, 3)))
df1 = df1.apply(lambda x: pd.Series([''.join(x)], index=['Name']), axis=1)
df1['FirstLetter'] = df1.Name.str.get(0)

df2 = pd.DataFrame(np.random.choice(list(ascii_uppercase), (1000, 10)))
df2 = df2.apply(lambda x: pd.Series([''.join(x)], index=['Name']), axis=1)
df2['FirstLetter'] = df2.Name.str.get(0)

df1.merge(df2, on='FirstLetter')
您只需对数据帧执行以下操作:

df1['FirstLetter'] = df1.Name.str.get(0)
df2['FirstLetter'] = df2.Name.str.get(0)
df1.merge(df2, on='FirstLetter')
具有通用名称的列将附加一个后缀(您可以控制:)。应表示所有列。注意,您可能需要使用
how
参数将合并行为更改为
'inner'
(默认)、
'outer'
'left'
'right'
之一

df1

df2.head()

df1.merge(df2,on='FirstLetter').head()


我会在上面创建一列“FirstLetter”和
[merge][1]

import pandas as pd
import numpy as np
from string import ascii_uppercase

df1 = pd.DataFrame(np.random.choice(list(ascii_uppercase), (5, 3)))
df1 = df1.apply(lambda x: pd.Series([''.join(x)], index=['Name']), axis=1)
df1['FirstLetter'] = df1.Name.str.get(0)

df2 = pd.DataFrame(np.random.choice(list(ascii_uppercase), (1000, 10)))
df2 = df2.apply(lambda x: pd.Series([''.join(x)], index=['Name']), axis=1)
df2['FirstLetter'] = df2.Name.str.get(0)

df1.merge(df2, on='FirstLetter')
您只需对数据帧执行以下操作:

df1['FirstLetter'] = df1.Name.str.get(0)
df2['FirstLetter'] = df2.Name.str.get(0)
df1.merge(df2, on='FirstLetter')
具有通用名称的列将附加一个后缀(您可以控制:)。应表示所有列。注意,您可能需要使用
how
参数将合并行为更改为
'inner'
(默认)、
'outer'
'left'
'right'
之一

df1

df2.head()

df1.merge(df2,on='FirstLetter').head()


什么是(5,3)和(1000,10)?这就是我用来生成随机数据的方法
(5,3)
表示抓取5行3列随机字母。我随后加入了他们。与
(1000,10)
相同。你不需要那些数据帧。我只是用它们来演示。这是一个了不起的解决方案。我有两个疑问-1。如何对数据中的实际名称执行此操作?2.另外,我想在我的结果中保持两个数据帧中的其他列的完整性。在名称太多的情况下,你有没有想法修改这个解决方案?内核似乎在运行此代码时死亡。要得到完全合并的结果需要花费很长时间。这就是为什么我要一个字母一个字母地写。有什么建议吗?非常感谢您的支持。(5,3)和(1000,10)表示什么?这是我用来生成随机数据的
(5,3)
表示抓取5行3列随机字母。我随后加入了他们。与
(1000,10)
相同。你不需要那些数据帧。我只是用它们来演示。这是一个了不起的解决方案。我有两个疑问-1。如何对数据中的实际名称执行此操作?2.另外,我想在我的结果中保持两个数据帧中的其他列的完整性。在名称太多的情况下,你有没有想法修改这个解决方案?内核似乎在运行此代码时死亡。要得到完全合并的结果需要花费很长时间。这就是为什么我要一个字母一个字母地写。有什么建议吗?我们将非常感谢您的支持。