np.where多个返回值

时间:2016-03-01 14:17:18

标签: python numpy pandas

使用pandas和numpy我正在尝试处理数据框中的列,并希望创建一个包含与之相关的值的新列。因此,如果在列x中存在值1,则在新列中它将是a,对于值2,它将是b等

我可以针对单一条件这样做,即

df['new_col'] = np.where(df['col_1'] == 1, a, n/a)

我可以找到多个条件的例子,即如果x = 3或x = 4,则该值应为a,但不执行如果x = 3,则值应为a,如果x = 4,则值为c。

我尝试过简单地运行两行代码,例如:

df['new_col'] = np.where(df['col_1'] == 1, a, n/a)
df['new_col'] = np.where(df['col_1'] == 2, b, n/a)

但显然第二行会覆盖。我错过了一些至关重要的东西吗?

4 个答案:

答案 0 :(得分:10)

我认为您可以使用loc

df.loc[(df['col_1'] == 1, 'new_col')] = a
df.loc[(df['col_1'] == 2, 'new_col')] = b

或者:

df['new_col'] = np.where(df['col_1'] == 1, a, np.where(df['col_1'] == 2, b, np.nan))

答案 1 :(得分:2)

我认为numpy import numpy as np choices = 'abcde' N = 10 np.random.seed(0) data = np.random.randint(1, len(choices) + 1, size=N) print(data) print(np.choose(data - 1, choices)) 是您的最佳选择。

[5 1 4 4 4 2 4 3 5 1]
['e' 'a' 'd' 'd' 'd' 'b' 'd' 'c' 'e' 'a']

输出:

{{1}}

答案 2 :(得分:0)

您可以使用所需的转换定义dict。 然后循环遍历DataFrame列并填充它。

可能有更优雅的方式,但这会有效:

   col_1  col_2  col_3  col_4 new_col
0      1      1      1      1       b
1      1      1      1      1       b
2      0      1      1      0       a
3      0      1      0      0       a
4      0      0      1      1       a
5      0      0      1      0       a

返回类似的内容:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    // Initial Elevation
    final Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
    if(toolbar!= null)
        toolbar.setElevation(0);

    // get initial position
    final int initialTopPosition = mRecyclerView.getTop();

    // Set a listener to scroll view
    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);

            if(toolbar!= null && mRecyclerView.getChildAt(0).getTop() < initialTopPosition ) {
                toolbar.setElevation(50);
            } else {
                toolbar.setElevation(0);
            }
        }
    });
}

答案 3 :(得分:0)

使用pandas enter image description here代替where。

import pandas as pd
df = pd.DataFrame({'col_1' : [1,2,4,2]})
print(df)

def ab_ify(v):
    if v == 1:
        return 'a'
    elif v == 2:
        return 'b'
    else:
        return None

df['new_col'] = df['col_1'].map(ab_ify)
print(df)

# output:
#
#    col_1
# 0      1
# 1      2
# 2      4
# 3      2
#    col_1 new_col
# 0      1       a
# 1      2       b
# 2      4    None
# 3      2       b