【问题标题】:Create Python DataFrame with the same column values from other DataFrames使用来自其他 DataFrame 的相同列值创建 Python DataFrame
【发布时间】:2015-03-08 22:00:00
【问题描述】:

我有许多 python DataFrame,我希望每个 DataFrame 在列中具有相同的值。我怎么能做到这一点?

例子:

  • DataFrame_1 有一列包含字符 A、B、V、D
  • DataFrame_2 有一列包含字符 D、C、B
  • DataFrame_3 有一列带有 char A,B

如何返回包含字符 B、B、B 的数据帧(因为 B 在所有数据帧中)

【问题讨论】:

  • 您能否澄清一下这些列。字母 A、B、C 等是列的名称,还是列数据中的值?如果是后者,三个数据框中的列的名称是什么?它们都一样吗?
  • A、B、C 字母是列中的值。三个数据框中的列名称相同。

标签: python numpy pandas unique dataframe


【解决方案1】:

一种复杂的方法是使用多个嵌套调用isin

In [39]:

df=pd.DataFrame({'a':['A','B','V','D']})
df1=pd.DataFrame({'a':['D','C','B']})
df2=pd.DataFrame({'a':['A','B']})
df[df.a.isin(df1[df1.a.isin(df2.a)].a)]
Out[39]:
   a
1  B

另一种方法是调用np.intersect1d,这假定值是唯一的:

In [46]:

np.intersect1d(df2.a.unique(), np.intersect1d(df.a.unique(), df1.a.unique()))
Out[46]:
array(['B'], dtype=object)

我们可以再次执行 2 个内部 merges 这将合并所有 dfs 中存在的值:

In [47]:

df.merge(df1, on='a').merge(df2, on='a')
Out[47]:
   a
0  B

时间

In [48]:

%timeit df[df.a.isin(df1[df1.a.isin(df2.a)].a)]
1000 loops, best of 3: 1.51 ms per loop
In [49]:

%timeit np.intersect1d(df2.a.unique(), np.intersect1d(df.a.unique(), df1.a.unique()))
1000 loops, best of 3: 360 µs per loop
In [50]:

%timeit df.merge(df1, on='a').merge(df2, on='a')
100 loops, best of 3: 4.76 ms per loop

numpy 方法在这个数据集上很容易获胜

【讨论】:

    【解决方案2】:

    要获得所有三个 DF 中存在的唯一值,您可以使用:

    unique_vals = set(df1['col']).intersection(df2['col'], df3['col'])
    

    这将(不出所料)给您一个set,然后您可以根据需要将其放回 DF/Series。

    【讨论】:

      【解决方案3】:

      如何将每一列视为一个集合,然后取交集:

      df = pd.DataFrame({'col1': ['A', 'B', 'V', 'D'], 
                         'col2': ['D', 'C', 'B', 'B'], 
                         'col3': ['A', 'B', 'A', 'B']})
      
      # First df column is a set
      new_set = set(df.iloc[:, 0])  
      # Iterate through remaining columns in df, taking intersection
      for col in df.iloc[:, 1:]:
          new_set = set(df[col]).intersection(new_set)
      

      将集合转换回数据框或系列:

      new_df = pd.DataFrame([new_set])
      print(new_df)
         0
      0  B
      

      【讨论】:

      • A set type set - 自 Python 2.4 以来一直是内置的,自 2.6 起已弃用并在 3.x+ 中删除...所以除非 OP 使用 sets 模块使用 Python 2.3气馁。
      • 我使用的是 2.7.9,上面的代码运行良好。 docs.python.org/2/library/sets.html
      • 它会......但就像我说的 - 不推荐......只是new_set = set(df.iloc[:, 0])就可以了......
      • 我明白了。谢谢你的提示。我会在上面修改我的答案。
      猜你喜欢
      • 2018-06-02
      • 1970-01-01
      • 2014-02-09
      • 1970-01-01
      • 2016-02-10
      • 2021-05-12
      • 2021-12-30
      • 2019-10-17
      • 2020-01-14
      相关资源
      最近更新 更多