如何检查列表中的位置索引是否存在于相应 DataFrame 的部分中
How to check if positional indexes in a list exists in section of corresponding DataFrame
我有一个像这样的 DataFrame:
Date A B C
2021-08-20 1 2 3
2021-08-21 2 3 4
2021-08-22 3 4 5
2021-08-23 4 5 6
2021-08-24 7 8 9
2021-08-25 10 11 12
2021-08-26 11 12 13
2021-08-28 12 13 14
我的“目标”部分是从 2021-08-21 到 2021-08-24 的日期。
现在我有一个位置索引列表:
A = [0, 1, 3, 4, 6, 7]
我想做的是创建一个新的索引列表,该列表仅对应于我的目标部分中的索引,然后找到新列表中元素的总数。
目标答案:
new_list = [1, 3, 4]
print(len(new_list))
3
到目前为止我已经试过了:
new_list = []
df_range = df.loc['2021-08-21':'2021-08-24']
for data_idx in A:
if data_idx == df_range.iloc[data_idx]:
new_list.append(data_idx)
print(len(new_list))
但我收到 IndexErrors(单个位置索引器超出范围)或 Key 错误(对于类似的尝试)。我相信错误是什么时候程序试图找到这个范围之外的索引?
在此先感谢您,如果有任何混淆,我们深表歉意。我知道应该有一个简单的方法来做到这一点,但我就是想不通。
如果我理解了这个问题,您想要一个包含与您的 df_range
对应的索引的列表?如果是这样,这两种方法通常用于
new_list = []
df_range = df.loc['2021-08-21':'2021-08-24']
for i, v in enumerate(df_range):
new_list.append(i)
for i in range(len(df_range)):
new_list.append(i)
IIUC:
A = [0, 1, 3, 4, 6, 7]
df["tmp"] = range(len(df))
x = df.loc["2021-08-21":"2021-08-24"]
print(x.loc[x["tmp"].isin(A), "tmp"].to_list())
打印:
[1, 3, 4]
如果'Date'在dataframe的索引中并且数据类型是日期时间索引,那么我们可以使用pd.Index.get_indexer
并使用集合操作来查找交集。
#Copy dataframe from question above
df = pd.read_clipboard(index_col=[0])
df.index = pd.to_datetime(df.index)
idx = df.index.get_indexer(pd.date_range('2021-08-21', '2021-08-24', freq='D'))
A = [0, 1, 3, 4, 6, 7]
overlap = set(A) & set(idx)
print(f'{overlap=} and {len(overlap)=}')
输出:
overlap={1, 3, 4} and len(overlap)=3
我有一个像这样的 DataFrame:
Date A B C
2021-08-20 1 2 3
2021-08-21 2 3 4
2021-08-22 3 4 5
2021-08-23 4 5 6
2021-08-24 7 8 9
2021-08-25 10 11 12
2021-08-26 11 12 13
2021-08-28 12 13 14
我的“目标”部分是从 2021-08-21 到 2021-08-24 的日期。
现在我有一个位置索引列表:
A = [0, 1, 3, 4, 6, 7]
我想做的是创建一个新的索引列表,该列表仅对应于我的目标部分中的索引,然后找到新列表中元素的总数。
目标答案:
new_list = [1, 3, 4]
print(len(new_list))
3
到目前为止我已经试过了:
new_list = []
df_range = df.loc['2021-08-21':'2021-08-24']
for data_idx in A:
if data_idx == df_range.iloc[data_idx]:
new_list.append(data_idx)
print(len(new_list))
但我收到 IndexErrors(单个位置索引器超出范围)或 Key 错误(对于类似的尝试)。我相信错误是什么时候程序试图找到这个范围之外的索引?
在此先感谢您,如果有任何混淆,我们深表歉意。我知道应该有一个简单的方法来做到这一点,但我就是想不通。
如果我理解了这个问题,您想要一个包含与您的 df_range
对应的索引的列表?如果是这样,这两种方法通常用于
new_list = []
df_range = df.loc['2021-08-21':'2021-08-24']
for i, v in enumerate(df_range):
new_list.append(i)
for i in range(len(df_range)):
new_list.append(i)
IIUC:
A = [0, 1, 3, 4, 6, 7]
df["tmp"] = range(len(df))
x = df.loc["2021-08-21":"2021-08-24"]
print(x.loc[x["tmp"].isin(A), "tmp"].to_list())
打印:
[1, 3, 4]
如果'Date'在dataframe的索引中并且数据类型是日期时间索引,那么我们可以使用pd.Index.get_indexer
并使用集合操作来查找交集。
#Copy dataframe from question above
df = pd.read_clipboard(index_col=[0])
df.index = pd.to_datetime(df.index)
idx = df.index.get_indexer(pd.date_range('2021-08-21', '2021-08-24', freq='D'))
A = [0, 1, 3, 4, 6, 7]
overlap = set(A) & set(idx)
print(f'{overlap=} and {len(overlap)=}')
输出:
overlap={1, 3, 4} and len(overlap)=3