既然它已被弃用,那么空数据帧的 .concat() 的替代方案是什么?

Tim*_*e W 17 python concatenation dataframe pandas

我有两个数据框,它们都可以为空,我想将它们连接起来。

在我可以做之前:

output_df= pd.concat([df1, df2])
Run Code Online (Sandbox Code Playgroud)

但现在我遇到了

FutureWarning:不推荐使用 DataFrame 与空或全 NA 条目串联的行为。在未来版本中,在确定结果 dtypes 时将不再排除空列或全 NA 列。要保留旧行为,请在连接操作之前排除相关条目。

一个简单的解决方法是:

if not df1.empty and not df2.empty:
    result_df = pd.concat([df1, df2], axis=0)
elif not df1.empty:
    result_df = df1.copy()
elif not df2.empty:
    result_df = df2.copy()
else:
    result_df = pd.DataFrame()
Run Code Online (Sandbox Code Playgroud)

但这看起来很丑陋。有人有更好的解决方案吗?

仅供参考:这是在pandas发布v2.1.0之后出现的

Tim*_*ess 10

准确地说,concat它并没有被弃用(并且不会被恕我直言),但我可以通过以下示例触发 ,同时是一个与以下内容不同的空 DataFrame :FutureWarning2.1.1df2dtypesdf1

df1 = pd.DataFrame({"A": [.1, .2, .3]})
df2 = pd.DataFrame(columns=["A"], dtype="object")

out = pd.concat([df1, df2]) ; print(out)

     A
0  0.1
1  0.2
2  0.3
Run Code Online (Sandbox Code Playgroud)

作为您的情况的解决方案,您可以尝试像您所做的那样:

out = (df1.copy() if df2.empty else df2.copy() if df1.empty
       else pd.concat([df1, df2]) # if both DataFrames non empty
      )
Run Code Online (Sandbox Code Playgroud)

或者甚至是这个?:

out = pd.concat([df1.astype(df2.dtypes), df2.astype(df1.dtypes)])
Run Code Online (Sandbox Code Playgroud)


val*_*nmk 6

我发现这个基于 @Timeless 答案的解决方案对我来说最“不丑陋”。

In [1]: import pandas as pd

In [2]: df = pd.DataFrame([], columns=['A', 'B'])

In [3]: df = pd.concat([
   ...:     df if not df.empty else None,
   ...:     pd.DataFrame([{'A': 1.1, 'B': 2.2}])
   ...: ])

In [4]: df
Out[4]: 
     A    B
0  1.1  2.2
Run Code Online (Sandbox Code Playgroud)