Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于条件提取列值_Python_Pandas_Dataframe_Loc - Fatal编程技术网

Python 基于条件提取列值

Python 基于条件提取列值,python,pandas,dataframe,loc,Python,Pandas,Dataframe,Loc,我有以下数据帧 df = pd.DataFrame({ 'Column_1': ['Position', 'Start', 'End', 'Position'], 'Original_1': ['Open', 'Barn', 'Grass', 'Bubble'], 'Latest_1': ['Shut', 'Horn', 'Date', 'Dinner'], 'Column_2': ['Start', 'Position', 'End', 'During']

我有以下数据帧

df = pd.DataFrame({
    'Column_1': ['Position', 'Start', 'End', 'Position'], 
    'Original_1': ['Open', 'Barn', 'Grass', 'Bubble'], 
    'Latest_1': ['Shut', 'Horn', 'Date', 'Dinner'], 
    'Column_2': ['Start', 'Position', 'End', 'During'], 
    'Original_2': ['Sky', 'Hold', 'Car', 'House'], 
    'Latest_2': ['Pedal', 'Lap', 'Two', 'Force'], 
    'Column_3': ['Start', 'End', 'Position', 'During'], 
    'Original_3': ['Leave', 'Dog', 'Block', 'Hope'], 
    'Latest_3': ['Sear', 'Crawl', 'Enter', 'Night']
})
对于单词位置位于“Column_1”、“Column_2”或“Column_3”中的每个实例,我希望捕获“Original_1”、“Original_2”、“Original_3”中的关联值,并将它们分配给名为“Original_values”的新列

下面的代码可以实现这一点,但只能在逐列的基础上实现

df['Original_Value1'] = df.loc[df['Column_1'] == 'Position', 'Original_1']
df['Original_Value2'] = df.loc[df['Column_2'] == 'Position', 'Original_2']
df['Original_Value3'] = df.loc[df['Column_3'] == 'Position', 'Original_3']
有没有办法重新创建上述代码,使其在整个数据帧上迭代(而不是通过指定的列)

我希望创建一列(“原始值”),结果如下:

0      Open
1      Hold
2     Block
3    Bubble
Name: Original_Values, dtype: object
一种方法是:

df.apply()
axis=1
参数导致对数据帧的每行调用一次
choose\u orig()
函数

请注意,当没有一列与单词
'Position'
匹配时,这将使用空字符串的默认值,
'
,一种方法是:

df.apply()
axis=1
参数导致对数据帧的每行调用一次
choose\u orig()
函数


注意,当没有一列与单词
'Position'

匹配时,这将使用空字符串的默认值
'
,这里有一种很愚蠢的方法来进行一些堆叠,如果您有一个非常大的
df
并且需要避免
axis=1
,这可能会执行得更好

  • 堆叠前三列以创建索引列表,以及该值对应的
    'Original'
  • 堆叠要从中获取值的列。使用上面的列表对其重新编制索引,以便返回适当的值
  • 根据原始行索引将这些值恢复到原始
    df
代码如下:

import re

mask_list = ['Column_1', 'Column_2', 'Column_3']
val_list = ['Original_1', 'Original_2', 'Original_3']

idx = df[mask_list].stack()[df[mask_list].stack() == 'Position'].index.tolist()
idx = [(x , re.sub('(.*_)', 'Original_', y)) for x, y in idx]

df['Original_Values'] = df[val_list].stack().reindex(idx).reset_index(level=1).drop(columns='level_1')
df
现在是:

   Column_1  Column_2  Column_3 ... Original_Values
0  Position     Start     Start ...            Open
1     Start  Position       End ...            Hold
2       End       End  Position ...           Block
3  Position    During    During ...          Bubble

如果在
掩码列表
的任何列中都找不到
“位置”
,则该行的
原始值
将变为
NaN
。如果您需要将其缩放到更多列,只需将它们添加到
mask_list
val_list
这里有一种愚蠢的方法,可以通过一些堆叠来实现,如果您有一个非常大的
df
并且需要避免
axis=1
,那么它的性能可能会更好

  • 堆叠前三列以创建索引列表,以及该值对应的
    'Original'
  • 堆叠要从中获取值的列。使用上面的列表对其重新编制索引,以便返回适当的值
  • 根据原始行索引将这些值恢复到原始
    df
代码如下:

import re

mask_list = ['Column_1', 'Column_2', 'Column_3']
val_list = ['Original_1', 'Original_2', 'Original_3']

idx = df[mask_list].stack()[df[mask_list].stack() == 'Position'].index.tolist()
idx = [(x , re.sub('(.*_)', 'Original_', y)) for x, y in idx]

df['Original_Values'] = df[val_list].stack().reindex(idx).reset_index(level=1).drop(columns='level_1')
df
现在是:

   Column_1  Column_2  Column_3 ... Original_Values
0  Position     Start     Start ...            Open
1     Start  Position       End ...            Hold
2       End       End  Position ...           Block
3  Position    During    During ...          Bubble

如果在
掩码列表
的任何列中都找不到
“位置”
,则该行的
原始值
将变为
NaN
。如果需要将其缩放到更多列,只需将它们添加到
mask_list
val_list

如何使用前3列创建一个掩码(或指定其名称),然后将其与第6列到第9列中的值相乘(或指定名称)。然后取max()值以删除nan

df['Original_Values'] = ((df.iloc[:,:3] == 'Position') * df.iloc[:,6:9].values).max(1)

print(df['Original_values'])
返回:

0      Open
1      Hold
2     Block
3    Bubble
Name: Original_Value, dtype: object

用前3列(或指定它们的名称)创建一个掩码,然后将其与第6到9列中的值相乘(或指定它们的名称),怎么样。然后取max()值以删除nan

df['Original_Values'] = ((df.iloc[:,:3] == 'Position') * df.iloc[:,6:9].values).max(1)

print(df['Original_values'])
返回:

0      Open
1      Hold
2     Block
3    Bubble
Name: Original_Value, dtype: object

这和你昨天的问题一样吗?我想这是你需要解释为什么要这样做的问题。我认为这些问题缺乏背景知识,无法理解您希望在何处应用代码。这与您昨天的问题相同吗?我认为这是您需要解释为什么要这样做的问题。我认为这个问题缺乏上下文来理解您想在哪里应用代码。