Python 如何修改数据帧,使其在数据帧中只包含具有共享索引值的行?
因此,我是一名数据科学专业的学生,在Python Pandas中处理一些数据,我有两个数据帧,其索引是日期(每个数据帧都是通过使用Pandas.readcsv(“filepath”,index_col=“DATE”,parse_dates=True,dayfirst=True)读取CSV文件生成的)。我想做的是修改这些数据帧,使它们各自只包含索引值由它们共享的行—这样,我可以直接比较它们以查找数据中的相关性 在过去的几个小时里,我一直在搜索文档,寻找实现这一点的方法,目前,我得到了以下代码:Python 如何修改数据帧,使其在数据帧中只包含具有共享索引值的行?,python,pandas,dataframe,Python,Pandas,Dataframe,因此,我是一名数据科学专业的学生,在Python Pandas中处理一些数据,我有两个数据帧,其索引是日期(每个数据帧都是通过使用Pandas.readcsv(“filepath”,index_col=“DATE”,parse_dates=True,dayfirst=True)读取CSV文件生成的)。我想做的是修改这些数据帧,使它们各自只包含索引值由它们共享的行—这样,我可以直接比较它们以查找数据中的相关性 在过去的几个小时里,我一直在搜索文档,寻找实现这一点的方法,目前,我得到了以下代码: c
common_dates = list(set(df1.index.values).intersection(df2.index.values))
print(common_dates)
print(normalized_house_index_data.index.values)
df1= df1.take(common_dates)
df2= df2.take(common_dates)
然而,这给了我一个索引越界错误,即使公共_日期应该从index.values数组中的项构造。当我查看作为疑难解答的一部分而添加的print()语句的输出时,我看到了以下常见日期:
[numpy.datetime64('2000-12-31T00:00:00.000000000'), numpy.datetime64('2001-12-31T00:00:00.000000000'), numpy.datetime64('2004-12-31T00:00:00.000000000'), numpy.datetime64('2003-12-31T00:00:00.000000000'), #and more values
对于df1.index.values,请执行以下操作:
['2000-12-31T00:00:00.000000000' '2001-12-31T00:00:00.000000000'
'2002-12-31T00:00:00.000000000' '2003-12-31T00:00:00.000000000' #and more values
df2.index.values的值看起来类似于df1
['1947-12-31T00:00:00.000000000' '1948-12-31T00:00:00.000000000'
#lots of values
'1997-12-31T00:00:00.000000000' '1998-12-31T00:00:00.000000000'
'1999-12-31T00:00:00.000000000' '2000-12-31T00:00:00.000000000'
'2001-12-31T00:00:00.000000000' '2002-12-31T00:00:00.000000000'
#more values
这会产生“索引超出范围”错误。我曾尝试使用list(map)(str,common_dates)将common_dates转换为字符串,因为它看起来可能存在某种类型的不匹配,但这会产生一个“invalid literal for int(),以10为基数:'2000-12-31T00:00:00.000000000'”错误;我曾尝试类似地将它们转换为int或numpy.datetime64,但这两者都会给出错误“索引超出范围”错误
我还尝试了使用df1.iterrows()的另一种方法:
我还尝试了一个版本,将每行的日期直接与df2.index.values的值进行比较。这两个版本都会导致从表中删除所有行,而不仅仅是删除不匹配的行
我做错了什么?我只是采取了错误的方法,还是我遗漏了什么?我认为
take
存在问题,因为我致力于通过常用索引进行选择:
a = pd.DatetimeIndex(['2000-12-31T00:00:00.000000000',
'2001-12-31T00:00:00.000000000',
'2002-12-31T00:00:00.000000000',
'2003-12-31T00:00:00.000000000'])
b = pd.DatetimeIndex(['1947-12-31T00:00:00.000000000',
'1948-12-31T00:00:00.000000000',
'1997-12-31T00:00:00.000000000',
'1998-12-31T00:00:00.000000000',
'1999-12-31T00:00:00.000000000',
'2000-12-31T00:00:00.000000000',
'2001-12-31T00:00:00.000000000',
'2002-12-31T00:00:00.000000000'])
df1 = pd.DataFrame(index=a)
df2 = pd.DataFrame(index=b)
common_dates = df1.index.intersection(df2.index)
print(common_dates)
DatetimeIndex(['2000-12-31', '2001-12-31', '2002-12-31'],
dtype='datetime64[ns]', freq='A-DEC')
也可用于通用索引:
a = pd.DatetimeIndex(['2000-12-31T00:00:00.000000000',
'2001-12-31T00:00:00.000000000',
'2002-12-31T00:00:00.000000000',
'2003-12-31T00:00:00.000000000'])
b = pd.DatetimeIndex(['1947-12-31T00:00:00.000000000',
'1948-12-31T00:00:00.000000000',
'1997-12-31T00:00:00.000000000',
'1998-12-31T00:00:00.000000000',
'1999-12-31T00:00:00.000000000',
'2000-12-31T00:00:00.000000000',
'2001-12-31T00:00:00.000000000',
'2002-12-31T00:00:00.000000000'])
df1 = pd.DataFrame(index=a)
df2 = pd.DataFrame(index=b)
common_dates = df1.index.intersection(df2.index)
print(common_dates)
DatetimeIndex(['2000-12-31', '2001-12-31', '2002-12-31'],
dtype='datetime64[ns]', freq='A-DEC')
我认为您需要
df=pd.merge(df1,df2,left\u index=True,right\u index=True)
然后打印(df.index)
是常见的日期。我不想合并数据帧;我想将它们分开,以便以后更容易比较。嗯,那么问题在于缺少@jezrael,这是怎么回事?我已经给出了创建数据帧的方法,我的代码操作数据帧,以及我的调试输出。你还想要什么?我无法运行代码验证索引越界错误,如果正确,我如何测试您的解决方案?@nick012000-感谢您的耐心!快乐编码;)
df1= df1.loc[common_dates]
df2= df2.loc[common_dates]
print (df1)
Empty DataFrame
Columns: []
Index: [2000-12-31 00:00:00, 2001-12-31 00:00:00, 2002-12-31 00:00:00]
print (df2)
Empty DataFrame
Columns: []
Index: [2000-12-31 00:00:00, 2001-12-31 00:00:00, 2002-12-31 00:00:00]