遍历列表并根据数据框中的条件使用值

时间:2019-08-28 19:52:24

标签: python pandas loops

我有以下内容:

dictionary = {'col1': ["England", "USA","Germany","Canada","Cuba","Vietnam"], 'col2': 
          ["France", "Spain","Italy","Jamaica","Bulgaria","South Korea"],
          "rating":[2,4,-5,2,1,2],"value":[1,1,2,2,3,3]}

table=pd.DataFrame(dictionary)

这将导致以下输出:

    col1    col2    rating  value
0   England France      2    1
1   USA     Spain       4    1
2   Germany Italy      -5    2
3   Canada  Jamaica     2    2
4   Cuba    Bulgaria    1    3
5   Vietnam South Korea 2    3

我分别列出了三个系列。

list([pd.Series([50,2],["const","Match Rating"]),
  pd.Series([48,2],["const","Match Rating"]),
  pd.Series([47,2.5],["const","Match Rating"])])

看起来像这样

[const  50
 Match Rating     2
 dtype: int64, 
 const  48
 Match Rating     2
 dtype: int64, 
 const   47
 Match Rating     2.5
 dtype: int64]

我想在数据框中创建一个称为“结果”的列,其中应用了公式。 Rating (from the dataframe) * match rating (from the list) + const (from the list) 当数据帧中的“值”为1时,应应用列表中的第一组元素,即50和2。当数据帧中的“值”为2时,应应用第二组元素,即48和2,依此类推。

所需的结果是这样的:

col1    col2      rating value  result
England France      2     1       54
USA     Spain       4     1       58
Germany Italy      -5     2       38
Canada  Jamaica     2     2       52
Cuba    Bulgaria    1     3       49.5
Vietnam South Korea 2     3       52

预先感谢

3 个答案:

答案 0 :(得分:3)

以下是在<h1>Show/Hide Test</h1> <div class="parent"> <div class="drawer"> <div class="accordion" id="accordion"> <button class="show-hide-toggle" id="show-hide-toggle">Show/Hide</button> <div class="show-hide-content" id="show-hide-content" tabindex="-1"> <p>This is some content that should be shown or hidden depending on the toggle.</p> </div> </div> <div class="spacer"> </div> </div> </div>之后使用merge的一种解决方案

concat

答案 1 :(得分:1)

您可以使用assign + merge来实现。

table.assign(val2 = table['value'] - 1)
            .merge(lookup.reset_index(), left_on='val2', right_on='index', how='left')
            .assign(result = lambda x: x['rating'].mul(x['Match Rating']).add(x['const']))
                  [['col1', 'col2', 'rating', 'value', 'result']]

输出:

      col1         col2  rating  value  result
0  England       France       2      1    54.0
1      USA        Spain       4      1    58.0
2  Germany        Italy      -5      2    38.0
3   Canada      Jamaica       2      2    52.0
4     Cuba     Bulgaria       1      3    49.5
5  Vietnam  South Korea       2      3    52.0

lookup DataFrame不在问题列表中。

lookup = pd.DataFrame(list([pd.Series([50,2],["const","Match Rating"]),
  pd.Series([48,2],["const","Match Rating"]),
  pd.Series([47,2.5],["const","Match Rating"])]))

答案 2 :(得分:1)

您可以使用列表中的自定义词典以及mapstr访问器来进行计算:

l = [pd.Series([50,2],["const","Match Rating"]),
     pd.Series([48,2],["const","Match Rating"]),
     pd.Series([47,2.5],["const","Match Rating"])]

d = {i: s.to_dict() for i, s in enumerate(l, 1)}
s = table.value.map(d)
table['result'] = table.rating * s.str['Match Rating'] +  s.str['const']    

Out[811]:
      col1         col2  rating  value  result
0  England       France       2      1    54.0
1      USA        Spain       4      1    58.0
2  Germany        Italy      -5      2    38.0
3   Canada      Jamaica       2      2    52.0
4     Cuba     Bulgaria       1      3    49.5
5  Vietnam  South Korea       2      3    52.0