简体   繁体   English

如何在pandas.DataFrame中插入满足条件的行值

[英]How to insert row values that meet a condition in pandas.DataFrame

I'm starting to learn Python and I've run into the following problem: I'm trying to join two dataframes below so that there are multiple rows containing the same names and parameters but for the entire range of temperatures. 我开始学习Python并且我遇到了以下问题:我正在尝试连接下面的两个数据帧,以便有多个行包含相同的名称和参数,但是对于整个温度范围。

    import pandas as pd
    frame1 = pd.DataFrame({'names':['bb1', 'bb2', 'bb3', 'bb4', 'bb5'],
                  'parameter1':['1', '2', '3', '4', '5'],
                  'parameter2':['0.1', '0.2', '0.3', '0.4', '0.5']})
    frame2 = pd.DataFrame({'names':['bb1', 'bb2', 'bb3', 'bb4', 'bb5'],
                  'temperature':['300', '400', '500', '600', '700']})

The output should look something like this 输出应该看起来像这样

        names  parameter1    parameter2    temperature
    0   bb1    1             0.1           300
    1   bb1    1             0.1           400
    ...
    5   bb2    2             0.2           300
    6   bb2    2             0.2           400
    ...

It feels like there should be built-in tools in pandas or itertools for that but I just can't figure it out. 感觉就像pandas或者itertools中应该有内置的工具,但我无法理解。

I attempted using itertools.product: 我尝试使用itertools.product:

    pd.DataFrame(list(itertools.product(parameters,temperature)))

but I can't think of a way to insert columns with parameters1 and parameters2 to match the entries in the names column. 但我想不出一种方法来插入带有parameters1和parameters2的列来匹配names列中的条目。 Help appreciated. 帮助赞赏。

(edit) Fixed example frame1 (编辑)固定示例frame1

You should first create a data frame that links every name to multiple temperatures and then merge it to frame1 using merge function. 您应首先创建一个数据框,将每个名称链接到多个温度,然后使用merge功能将其合并到frame1

import pandas as pd
from itertools import product
frame1 = pd.DataFrame({'names':['bb1', 'bb2', 'bb3', 'bb4', 'bb5'],
                  'parameter1':['1', '2', '3', '4', '5'],
                  'parameter2':['0.1', '0.2', '0.3', '0.4', '0.5']})
names = ['bb1', 'bb2', 'bb3', 'bb4', 'bb5']
temperatures = ['300', '400', '500', '600', '700']
frame2 = pd.DataFrame.from_records(list(product(names, temperatures)),
                                   columns=['names', 'temperatures'])
df = frame1.merge(frame2)

You can use pd.merge take inner join on 'names'. 您可以使用pd.merge对'名称'进行内连接。

>>> pd.merge(frame1, frame2, how='inner', on = 'names')


  names parameter1 parameter2 temperature
0   bb1          1        0.1         300
1   bb1          1        0.1         121
2   bb2          2        0.2         400
3   bb3          3        0.3         500
4   bb4          4        0.4         600
5   bb5          5        0.5         700

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM