python - 如何通过有条件地查找另一个 DF 并将结果水平附加到新的 DF 中来创建 DF?
问题描述
我有两个数据框 - df1 包含所有数据,df2 将成为查找 df1 的基础。我需要在 DF2 中创建一个每行一行的“结果”数据框,其中每一行应该是 DF2 中的原始行,然后水平地是 DF1 中与 ID 匹配的每一行,并且日期早于或等于到指定的日期。
我实际上需要在 DF1 中找到与 DF2 中给定行的 ID 和所有先前日期相对应的迷你数据帧(参见下面的代码片段),然后将所述迷你 DF 的每一行附加到 DF2 的右侧。
我了解,根据代码片段 1,如何根据 DF2 中的条件找到 mini_df,但是我不知道如何创建水平包含附加行的新数据框。理想情况下,我想指定我从所述数据框中获取的行数,例如,如果 10 行与 ID 和之前或日期标准匹配,我想取其中的 6 行。
#code snippet 1 to create mini dataframe from df1 for each row in df2
mini_df = df1[(df1['ID']=='A0') & (df1['Date']<='20200102')]
df1
ID1 Date1 Value
0 A0 20200101 123
1 A0 20200102 234
2 A0 20200103 345
3 A1 20200101 456
4 A1 20200102 567
5 A1 20200103 678
df2
ID2 Date2
0 A0 20200103
1 A1 20200103
result
ID2 Date2 ID1-1 Date1-1 Value-1 ID1-2 Date1-2 Value-2 ID1-3 Date1-3 Value-3
0 A0 20200103 A0 20200101 123 A0 20200102 234 A0 20200103 345
1 A1 20200103 A1 20200101 456 A1 20200102 567 A1 20200103 678
重现表格的代码:
import pandas as pd
df1 = pd.DataFrame({'ID1': ['A0', 'A0','A0', 'A1', 'A1', 'A1'],
'Date1': ['20200101', '20200102','20200103', '20200101', '20200102','20200103'],
'Value':[123,234,345,456,567,678]})
df2 = pd.DataFrame({'ID2': ['A0', 'A1'],'Date2': ['20200102', '20200102',],})
result = pd.DataFrame({'ID2':['A0','A1'],
'Date1':['20200102', '20200102',],
'ID1-1':['A0','A1'],
'Date1-1': ['20200101','20200101'],
'Value-1':[123,456],
'ID1-2':['A0','A1'],
'Date1-2': ['20200102','20200102'],
'Value-2':[234,567],
'ID1-3':['A0','A1'],
'Date1-3': ['20200103','20200103'],
'Value-3':[345,678],
})
提前感谢您的任何建议。
解决方案
如果您像这样向第一个 df 添加一列:
df1 = pd.DataFrame([
[ 'A0',20200101, 123,1],
[ 'A0',20200102, 234,2],
[ 'A0',20200103, 345,3],
[ 'A1',20200101, 456,1],
[ 'A1',20200102, 567,2],
[ 'A1',20200103, 678,3]
],columns=['ID1','Date1','Value','cat'])
df2 = pd.DataFrame([
[ 'A0',20200103],
[ 'A1',20200103]
],columns=['ID2','Date2'])
您可以将 df2 与 df1 中的 df 组合并:
for group in df1.groupby('cat'):
print(group[1].iloc[0]['cat'])
df2 = df2.merge(
group[1][['ID1','Date1','Value']],
left_on='ID2',
right_on='ID1',
)
推荐阅读
- python-3.x - 使用多个索引获取部分 DataFrame
- c - 如何添加扫描端口 ip
- c# - 在一个 ASP 核心应用程序中使用多个 SPA
- linux - 如何在 Linux 中使用标题在制表符分隔的文件中添加行名
- angular - 如何以两种不同的方式(样式)显示角度组件(包括 html)
- python - 如何在 python 中捕获所有超出范围的索引错误?
- angular - 编译 Angular 应用程序后 Leaflet-geotiff 插件错误
- java - 如何升级 LibGDX 的 gradle 包装器版本
- dax - 如何使用应用于另一个表的过滤器来过滤一个度量?
- kubernetes - 运行 kubectl 作业时是否可以发送文件?