遍历不同的数据框熊猫

时间:2020-02-10 15:40:02

标签: python pandas

Hello World

我有52个数据帧(df和数据),每个数据帧仅包含带有首字母的Name(名称)。

下面是字母A和B(包含在df和数据中)的示例

dfA                                                 dfB
Code  Name                                          Code  Name
15    Amiks                                         68    Bernard 
157   Alis                                          14    Barpti

dataA                                               dataB
Code  Name                                          Code  Name 
      Amiks                                               Berti
      Alis                                                Bernard
      Anatole                                             Barpti

问题:

不是Python专家,如何在具有相同字母的数据框上循环?而不是寻找所有数据框,而是寻找相同的字母。

例如:检查是否:

  • dataA.Name在dfA.Name中?
  • dataB.Name是否在dfB.Name中?
  • dataZ.Name在dfZ.Name中?

编辑

原始DF在下面

df                                                 data
Code  Name                                          Code  Name
15    Amiks                                               Amiks   
157   Alis                                                Alis
14    Barpti                                             Bernard 
68    Bernard                                            Barpti

我刚为每个字母创建了一个df。

目的是为了加快计算时间,并避免在整个DF中进行检查,因为我们只能检查具有相同首字母的行。

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

您应该认为变量名称仅对您有意义,而对Python解释器没有意义。当然,有一些使用locals()globals()的骇客方式,但绝不能在 normal 代码中使用它们。

这意味着您的数据框是相关的,您应该使用数据结构来跟踪该关系。您可以使用2个列表或成对列表,例如:

dataframes = [ (dfA, dataA), (dfB, dataB), ...]

如果字母本身很重要,则可以使用字典:

dataframes = { 'A': (dfA, dataA), 'B': (dfB, dataB), ...}

然后您可以轻松地进行迭代:

for letter in dataframes:
    commons = dataframes[letter][0].merge(dataframes[letter][1], on='Name',
                                          suffixes=('_x', ''))[['Code', 'Name']]
    # process commons which contains code and name where datax.Name is in dfx.Name
    ...

但是,除非原始数据帧真的很大,否则我建议您将第一个字母帧的单个数据帧与52个数据帧进行基准测试。如果一切都适合记忆,熊猫就算有效……

答案 1 :(得分:0)

对于那些可能感兴趣的人,以下是我的工作:

步骤1:重新合并所有df和数据。

输出为:

  • Df(包含所有字母)
  • 数据(包含所有字母)

步骤2:检索姓名的第一个字母

 # Function to retrieve first letter
    def first_letter(data, col):
        a= data[col].map(lambda x: x[0])
        b= np.unique(a)
        c= b.tolist()
        return c

步骤3:循环DF和数据

仅比较首字母相同的名称

# Apply function to retrieve unique first letter of Name's column and UV
first= first_letter(df, 'Name')

# Loop over each first letter to apply the matching by starting with the same letter for both DF
for letter in first:
    df_first= df[df['Name'].str.startswith(letter)]
    data_first= data[data['Name'].str.startswith(letter)]

# Process
....

使用此代码,我只能为那些具有相同首字母并且没有查看整个DF的人匹配名称。