GVKun编程网logo

如何在字符串包含上合并pandas?(字符串合并python)

11

在本文中,我们将带你了解如何在字符串包含上合并pandas?在这篇文章中,我们将为您详细介绍如何在字符串包含上合并pandas?的方方面面,并解答字符串合并python常见的疑惑,同时我们还将给您一些

在本文中,我们将带你了解如何在字符串包含上合并pandas?在这篇文章中,我们将为您详细介绍如何在字符串包含上合并pandas?的方方面面,并解答字符串合并python常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的Pandas Dataframe 在两个不同的键上合并以获取原始数据、Pandas 在 Like % 上合并、Pandas-GroupBy,然后在原始表上合并、Pandas在日期栏上合并

本文目录一览:

如何在字符串包含上合并pandas?(字符串合并python)

如何在字符串包含上合并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 在两个不同的键上合并以获取原始数据

如何解决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 % 上合并

如何解决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-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在日期栏上合并

Pandas在日期栏上合并

我正在尝试在date列上合并两个数据框(都尝试作为typeobjectdatetime.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在日期栏上合并的相关知识,请在本站寻找。

本文标签: