【问题标题】:Build Pandas DataFrame with String Entries using 2 Separate DataFrames使用 2 个单独的 DataFrame 构建带有字符串条目的 Pandas DataFrame
【发布时间】:2019-11-18 19:16:39
【问题描述】:

假设你有两个单独的 pandas DataFrames 具有相同的行和列索引(在我的例子中,列索引是通过 .unstack()'ing 使用 df.groupby([col1,col2]) 构建的 MultiIndex 构建的)

df1 = pd.DataFrame({'a':[.01,.02,.03],'b':[.04,.05,.06]})
df2 = pd.DataFrame({'a':[.04,.05,.06],'b':[.01,.02,.03]})

现在假设我想创建第三个 DataFrame,df3,其中 df3 的每个条目都是一个字符串,它使用 df1 和 df2 的相应元素条目。例如,

df3.iloc[0,0] = '{:.0%}'.format(df1.iloc[0,0]) + '\n' + '{:.0%}'.format(df2.iloc[0,0])

我认识到这可能很容易通过循环遍历 df1 和 df2 中的所有条目并根据这些值在 df3 中创建一个新条目(对于大型 DataFrames 可能会很慢),或者甚至将两个 DataFrames 连接在一起(这可能需要重命名列),但我想知道是否有更 Pythonic/pandorable 的方式来实现这一点,可能使用 applymap 或其他一些内置的 pandas 函数?

问题与Combine two columns of text in dataframe in pandas/python类似,但上一个问题没有考虑将多个DataFrame合并为一个。

【问题讨论】:

    标签: python-3.x pandas dataframe concatenation


    【解决方案1】:

    IIUC,您只需将df1df2 加上'\n'

    df3 = df1.astype(str) + '\n' + df2.astype(str)
    
    Out[535]:
                a           b
    0  0.01\n0.04  0.04\n0.01
    1  0.02\n0.05  0.05\n0.02
    2  0.03\n0.06  0.06\n0.03
    

    【讨论】:

    • 当我添加+'\n' 时,我不断收到错误TypeError: Cannot cast array data from dtype('float64') to dtype('<U32') according to the rule 'safe',但没有那个df.astype(str) 的总和工作正常。有什么想法吗?另外,我正在使用 Databricks 并强制它使用 matplotlib 3.0.3
    • 我没有使用Databricks 的经验,所以我无法帮助您解决这个错误。但是,您可以检查astype(str) 的输出中是否有任何NaN 作为df1.astype(str).isna().all(None),并对df2 执行相同操作
    • 我不认为平台(Databricks)在这里有所作为,任何 dfs 中的任何条目都不是 None/Null,所以我仍然很难过。我会继续努力解决的!
    【解决方案2】:

    您可以利用 Pandas 的矢量化操作(假设数据框共享行和列索引)

    (df1 * 100).astype(str) + '%\n' + (df2 * 100).astype(str) + '%' 
    

    你得到

        a           b
    0   1.0%\n4.0%  4.0%\n1.0%
    1   2.0%\n5.0%  5.0%\n2.0%
    2   3.0%\n6.0%  6.0%\n3.0%
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-19
      • 2021-12-28
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      相关资源
      最近更新 更多