在本文中,我们将带你了解如何在字符串包含上合并pandas?在这篇文章中,我们将为您详细介绍如何在字符串包含上合并pandas?的方方面面,并解答字符串合并python常见的疑惑,同时我们还将给您一些
在本文中,我们将带你了解如何在字符串包含上合并pandas?在这篇文章中,我们将为您详细介绍如何在字符串包含上合并pandas?的方方面面,并解答字符串合并python常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的Pandas Dataframe 在两个不同的键上合并以获取原始数据、Pandas 在 Like % 上合并、Pandas-GroupBy,然后在原始表上合并、Pandas在日期栏上合并。
本文目录一览:- 如何在字符串包含上合并pandas?(字符串合并python)
- Pandas Dataframe 在两个不同的键上合并以获取原始数据
- Pandas 在 Like % 上合并
- Pandas-GroupBy,然后在原始表上合并
- Pandas在日期栏上合并
如何在字符串包含上合并pandas?(字符串合并python)
我有2个数据框,我想将它们合并到一个公共列上。但是,我要合并的列不是同一字符串,而是另一个中包含一个字符串,如下所示:
import pandas as pddf1 = pd.DataFrame({''column_a'':[''John'',''Michael'',''Dan'',''George'', ''Adam''], ''column_common'':[''code'',''other'',''ome'',''no match'',''word'']})df2 = pd.DataFrame({''column_b'':[''Smith'',''Cohen'',''Moore'',''K'', ''Faber''], ''column_common'':[''some string'',''other string'',''some code'',''this code'',''word'']})
我想要的结果d1.merge(d2, ...)
如下:
column_a | column_b----------------------John | Moore <- merged on ''code'' contained in ''some code'' Michael | Cohen <- merged on ''other'' contained in ''other string'' Dan | Smith <- merged on ''ome'' contained in ''some string'' George | n/aAdam | Faber <- merged on ''word'' contained in ''word''
答案1
小编典典新答案
这是一种基于pandas / numpy的方法。
rhs = (df1.column_common .apply(lambda x: df2[df2.column_common.str.find(x).ge(0)][''column_b'']) .bfill(axis=1) .iloc[:, 0])(pd.concat([df1.column_a, rhs], axis=1, ignore_index=True) .rename(columns={0: ''column_a'', 1: ''column_b''})) column_a column_b0 John Moore1 Michael Cohen2 Dan Smith3 George NaN4 Adam Faber
旧答案
这是左联接行为的一种解决方案,因为它不会保留column_a
不匹配任何column_b
值的值。这比上面的numpy /
pandas解决方案要慢,因为它使用两个嵌套iterrows
循环来构建python列表。
tups = [(a1, a2) for i, (a1, b1) in df1.iterrows() for j, (a2, b2) in df2.iterrows() if b1 in b2](pd.DataFrame(tups, columns=[''column_a'', ''column_b'']) .drop_duplicates(''column_a'') .reset_index(drop=True)) column_a column_b0 John Moore1 Michael Cohen2 Dan Smith3 Adam Faber
Pandas Dataframe 在两个不同的键上合并以获取原始数据
如何解决Pandas Dataframe 在两个不同的键上合并以获取原始数据?
问题标题可能令人困惑,但这是我打算执行的示例。
下面是一个带有请求数据的主要数据框
d = {''ID'':[''A1'',''A2'',''A3'',''A4''],''ID2'': [''B1'',''B2'',''B3'',''B4''],''B'':[-1,5,6,7000],''ExtD'':[''CA'',''CB'',''CC'',''CD'']}
df = pd.DataFrame(data=d)
df
现在,响应可能基于 ID 或 ID2 列,如下所示 -
d = {''RetID'':[''A1'',''C'':[1.3,5.4,4.5,1.3]}
df2 = pd.DataFrame(data=d)
df2
其中 RetID 可以是请求中的 ID 或 ID2 以及附加数据 C。一旦收到响应,我需要将其与原始数据帧合并以获取数据 ExtD。
我想出的解决方案是 -
df2 = df2.merge(df[[''ID'',''ExtD'',]],''left'',left_on=[''RetID''],right_on=[''ID''])
df2 = df2.merge(df[[''ID2'',''ExtD'']],right_on=[''ID2''],suffixes = (''_d1'',''_d2''))
df2.rename({''ExtD_d1'':''ExtD''},axis=1,inplace=True)
df2.loc[df2[''ExtD''].isnull(),''ExtD''] = df2[''ExtD_d2'']
df2.drop({''ID2'',''ExtD_d2''},inplace=True)
所以预期的输出是,
res = {''RetID'':[''A1'',1.3],''CD'']}
df2= pd.DataFrame(data=res)
df2
EDIT2:更新了需求调整。
res = {''RetID'':[''A1'',''B1'',''B2''],''CD''],''ID'':[''A1'',''B4'']}
有没有一种有效的方法来做到这一点?可能有 2 个以上的 ID - ID、ID2、ID3 和不止一列要从请求数据帧加入。 TIA。
编辑:修正了错字。
解决方法
使用 melt
转换您的第一个数据框,然后使用 merge
转换第二个:
tmp = df.melt(''ExtD'',value_vars=[''ID'',''ID2''],value_name=''RetID'')
df2 = df2.merge(tmp[[''ExtD'',''RetID'']])
>>> df2
RetID C ExtD
0 A1 1.3 CA
1 A2 5.4 CB
2 B1 4.5 CA
3 B2 1.3 CB
>>> tmp
ExtD variable RetID
0 CA ID A1
1 CB ID A2
2 CC ID A3
3 CD ID A4
4 CA ID2 B1
5 CB ID2 B2
6 CC ID2 B3
7 CD ID2 B4
更新
如果我还需要合并 ID 和 ID2 列怎么办?
df2 = df2.merge(df[[''ID'',''ID2'',''ExtD'']],on=''ExtD'')
>>> df2
RetID C ExtD ID ID2
0 A1 1.3 CA A1 B1
1 A2 5.4 CB A2 B2
2 B3 4.5 CC A3 B3
3 B4 1.3 CD A4 B4
Pandas 在 Like % 上合并
如何解决Pandas 在 Like % 上合并?
在 sql 中,当我希望一列上的文本包含另一列的文本时,我可以执行以下操作:
select *
from a inner join b on a.col like ''%'' + b.col ''%''
有没有办法在 Pandas 中做到这一点?我见过一些像 https://stackoverflow.com/a/50573508/3515825 这样的帖子,他们在其中加入并过滤。但是,我只有一个条件/列可以加入,我不知道从哪里开始。
我应该从交叉连接合并开始然后过滤吗?有没有更有效的方法来做到这一点?
更新这里是一个例子:
DF A
Name Grade
Sam F. Jones A
Rick Smith B
DF B
Last Name Year
Jones 12
Smith 10
我想根据名字中的姓氏连接两个数据框。请注意,实际上,我想要做的更复杂,我不能过分依赖“名称”列的结构。
谢谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
Pandas-GroupBy,然后在原始表上合并
我正在尝试编写一个函数来汇总并在Pandas中的数据框上执行各种统计数据计算,然后将其合并到原始数据框,但是,我遇到了问题。这与SQL中的代码等效:
SELECT EID,PCODE,SUM(PVALUE) AS PVALUE,SUM(SQRT(SC*EXP(SC-1))) AS SC,SUM(SI) AS SI,SUM(EE) AS EE
INTO foo_bar_grp
FROM foo_bar
GROUP BY EID,PCODE
然后加入原始表:
SELECT *
FROM foo_bar_grp INNER JOIN
foo_bar ON foo_bar.EID = foo_bar_grp.EID
AND foo_bar.PCODE = foo_bar_grp.PCODE
步骤如下:将数据加载到 :>>
pol_dict = {'PID':[1,1,2,2],'EID':[123,123,123],'PCODE':['GU','GR','GU','GR'],'PVALUE':[100,50,150,300],'SI':[400,40,140,140],'SC':[230,23,213,213],'EE':[10000,10000,2000,30000],}
pol_df = DataFrame(pol_dict)
pol_df
出:>>
EID EE PCODE PID PVALUE SC SI
0 123 10000 GU 1 100 230 400
1 123 10000 GR 1 50 23 40
2 123 2000 GU 2 150 213 140
3 123 30000 GR 2 300 213 140
步骤2:对数据进行计算和分组:
我的熊猫代码如下:
#create aggregation dataframe
poagg_df = pol_df
del poagg_df['PID']
po_grouped_df = poagg_df.groupby(['EID','PCODE'])
#generate acc level aggregate
acc_df = po_grouped_df.agg({
'PVALUE' : np.sum,'SI' : lambda x: np.sqrt(np.sum(x * np.exp(x-1))),'SC' : np.sum,'EE' : np.sum
})
在我想加入原始表之前,此方法可以正常工作:
IN:>>
po_account_df = pd.merge(acc_df,po_df,on=['EID','PCODE'],how='inner',suffixes=('_Acc','_Po'))
OUT:>> KeyError:您没有名为EID的项目
由于某种原因,分组的数据框无法联接回原始表。我已经研究了尝试将groupby列转换为实际列的方法,但这似乎不起作用。
请注意,最终目标是能够找到每一列(PVALUE,SI,SC,EE)IE的百分比:
pol_acc_df['PVALUE_PCT'] = np.round(pol_acc_df.PVALUE_Po/pol_acc_df.PVALUE_Acc,4)
谢谢!
Pandas在日期栏上合并
我正在尝试在date列上合并两个数据框(都尝试作为typeobject
或datetime.date
,但是无法提供所需的合并输出:
import pandas as pddf1 = pd.DataFrame({''amt'': {0: 1549367.9496070854, 1: 2175801.78219801, 2: 1915613.1629125737, 3: 1703063.8323954903, 4: 1770040.7987461537}, ''month'': {0: ''2015-02-01'', 1: ''2015-03-01'', 2: ''2015-04-01'', 3: ''2015-05-01'', 4: ''2015-06-01''}})print(df1) amt month 0 1.549368e+06 2015-02-01 1 2.175802e+06 2015-03-01 2 1.915613e+06 2015-04-01 3 1.703064e+06 2015-05-01 4 1.770041e+06 2015-06-01df2 = {''factor'': {datetime.date(2015, 2, 1): 1.0, datetime.date(2015, 3, 1): 1.0, datetime.date(2015, 4, 1): 1.0, datetime.date(2015, 5, 1): 1.0, datetime.date(2015, 6, 1): 0.99889679025914435}, ''month'': {datetime.date(2015, 2, 1): datetime.date(2015, 2, 1), datetime.date(2015, 3, 1): datetime.date(2015, 3, 1), datetime.date(2015, 4, 1): datetime.date(2015, 4, 1), datetime.date(2015, 5, 1): datetime.date(2015, 5, 1), datetime.date(2015, 6, 1): datetime.date(2015, 6, 1)}}df2 = pd.DataFrame(df2)print(df2) factor month 2015-02-01 1.000000 2015-02-01 2015-03-01 1.000000 2015-03-01 2015-04-01 1.000000 2015-04-01 2015-05-01 1.000000 2015-05-01 2015-06-01 0.998897 2015-06-01pd.merge(df2, df1, how=''outer'', on=''month'') factor month amt 0 1.000000 2015-02-01 NaN 1 1.000000 2015-03-01 NaN 2 1.000000 2015-04-01 NaN 3 1.000000 2015-05-01 NaN 4 0.998897 2015-06-01 NaN 5 NaN 2015-02-01 1.549368e+06 6 NaN 2015-03-01 2.175802e+06 7 NaN 2015-04-01 1.915613e+06 8 NaN 2015-05-01 1.703064e+06 9 NaN 2015-06-01 1.770041e+06
答案1
小编典典我认为您需要首先转换两列,to_datetime
因为需要相同的内容dtypes
:
df1.month = pd.to_datetime(df1.month)df2.month = pd.to_datetime(df2.month)print (pd.merge(df2, df1, how=''outer'', on=''month'')) factor month amt0 1.000000 2015-02-01 1.549368e+061 1.000000 2015-03-01 2.175802e+062 1.000000 2015-04-01 1.915613e+063 1.000000 2015-05-01 1.703064e+064 0.998897 2015-06-01 1.770041e+06
#convert to str date columndf2.month = df2.month.astype(str)print (pd.merge(df2, df1, how=''outer'', on=''month'')) factor month amt0 1.000000 2015-02-01 1.549368e+061 1.000000 2015-03-01 2.175802e+062 1.000000 2015-04-01 1.915613e+063 1.000000 2015-05-01 1.703064e+064 0.998897 2015-06-01 1.770041e+06
关于如何在字符串包含上合并pandas?和字符串合并python的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Pandas Dataframe 在两个不同的键上合并以获取原始数据、Pandas 在 Like % 上合并、Pandas-GroupBy,然后在原始表上合并、Pandas在日期栏上合并的相关知识,请在本站寻找。
本文标签: