【问题标题】:Combining pandas DataFrames with different row count将 pandas DataFrames 与不同的行数相结合
【发布时间】:2019-10-19 17:51:13
【问题描述】:

我已经开始开发一些脚本来操作和绘制数据。我在 python 中使用 pandas 的经验不是很丰富。

问题描述如下。我有一个带有日期的 DataFrame time

     Date
0   Jul-03      
1   Jul-04
2   Jul-05
3   Jul-06
4   Jul-07
5   Jul-08
6   Jul-09

然后我还有另外两个 DataFrame,data1data2

(data1)
     Date      Count
0   Jul-05      20
1   Jul-06      10
(data2)
     Date      Count
0   Jul-09      36

我的目标是获得如下所示的 DataFrame 以绘制结果。如您所见,当data1data2time DataFrame 没有对应的日期时,我需要零。

     Date      data1      data2
0   Jul-03       0          0
1   Jul-04       0          0
2   Jul-05       20         0
3   Jul-06       10         0
4   Jul-07       0          0
5   Jul-08       0          0
6   Jul-09       0         36

我尝试了很多东西 - 已经战斗了 1 天,但仍然没有进展 :)。希望您能提供帮助!

亲切的问候

【问题讨论】:

  • 在 SQL 中,您可以使用连接来处理这个问题。事实证明,Pandas 具有类似的加入数据框的功能。我建议调查一下:)
  • 到目前为止你做了什么?你搜索过熊猫文档吗?它包含大量有关如何操作数据的示例和文章,我很确定您的问题在那里有所描述。首先展示你的努力:文档、链接、代码、其他 SO 问题。

标签: python pandas dataframe plot


【解决方案1】:

正如对方所说:去网上查一下文档吧!

无论如何,这里有一种方法可以解决您的问题:

1- 设置数据框

In [1]:
import pandas as pd

columns = ['Date']
data = ['Jul-03'
    ,'Jul-04'
    ,'Jul-05'
    ,'Jul-06'
    ,'Jul-07'
    ,'Jul-08'
    ,'Jul-09']

time = pd.DataFrame(data = data, columns = columns)

columns = ['Date', 'Count']
data = [
        ['Jul-05', 20],
        ['Jul-06', 10]
       ]
data1 = pd.DataFrame(data=data, columns=columns)

data2 = pd.DataFrame(data=[['Jul-09', 36]], columns=columns)

2- 合并数据框

In [2]:
df_list = [data1, data2]
iterator = 0
for df in df_list:
    iterator += 1
    column_name = 'data' + str(iterator)
    time = time.merge(df, how='left', left_on='Date', right_on='Date').fillna(0).rename(columns={'Count':column_name})
time
 
Out [2]:
    Date    data1   data2
0   Jul-03  0.0     0.0
1   Jul-04  0.0     0.0
2   Jul-05  20.0    0.0
3   Jul-06  10.0    0.0
4   Jul-07  0.0     0.0
5   Jul-08  0.0     0.0
6   Jul-09  0.0     36.0

【讨论】:

  • 感谢您的回复。我没有使用 for 循环,因为在我的情况下,data1data2data3 等等会有不同的名称。但是您的回复非常清楚地表明merge 可以与fillna 一起使用,这对我来说非常有用!谢谢。
【解决方案2】:

如果“日期”设置为索引,行对齐将起作用。

df_rslt= df_time.set_index("Date")

df_rslt["data1"]= df_data1.set_index("Date")["Count"]
df_rslt["data2"]= df_data2.set_index("Date")["Count"]

df_rslt.fillna(0,inplace=True)

【讨论】:

    猜你喜欢
    • 2021-07-07
    • 2021-10-31
    • 2017-05-27
    • 2019-08-06
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多