Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何修改数据帧,使其在数据帧中只包含具有共享索引值的行?_Python_Pandas_Dataframe - Fatal编程技术网

Python 如何修改数据帧,使其在数据帧中只包含具有共享索引值的行?

Python 如何修改数据帧,使其在数据帧中只包含具有共享索引值的行?,python,pandas,dataframe,Python,Pandas,Dataframe,因此,我是一名数据科学专业的学生,在Python Pandas中处理一些数据,我有两个数据帧,其索引是日期(每个数据帧都是通过使用Pandas.readcsv(“filepath”,index_col=“DATE”,parse_dates=True,dayfirst=True)读取CSV文件生成的)。我想做的是修改这些数据帧,使它们各自只包含索引值由它们共享的行—这样,我可以直接比较它们以查找数据中的相关性 在过去的几个小时里,我一直在搜索文档,寻找实现这一点的方法,目前,我得到了以下代码: c

因此,我是一名数据科学专业的学生,在Python Pandas中处理一些数据,我有两个数据帧,其索引是日期(每个数据帧都是通过使用Pandas.readcsv(“filepath”,index_col=“DATE”,parse_dates=True,dayfirst=True)读取CSV文件生成的)。我想做的是修改这些数据帧,使它们各自只包含索引值由它们共享的行—这样,我可以直接比较它们以查找数据中的相关性

在过去的几个小时里,我一直在搜索文档,寻找实现这一点的方法,目前,我得到了以下代码:

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]