Я думаю, что eq
+ idxmax
здесь проще всего для нескольких слов и точных совпадений с гарантией того, что оно есть. Так как это всего 8 слов, возможно, это просто понимание списка и объединение результатов:
import pandas as pd
import numpy as np
np.random.seed(123)
l = ['']*192 + ['paid', 'foo', 'bar', 'baz']
df = pd.DataFrame([np.random.choice(l, replace=False, size=196)
for i in range(5)])
pd.concat([df.eq(word).idxmax(1).rename(word) for word in ['paid', 'foo', 'bar', 'baz']],
axis=1)
# paid foo bar baz
#0 112 167 184 142
#1 186 93 17 173
#2 56 142 179 67
#3 15 78 38 79
#4 116 84 18 61
<час> Если вы нужно только проверять столбцы [4: 196] использовать df.iloc[:, 4:197].eq(word)
вместо проверки каждого столбца
У Вас есть несколько опций, представленных здесь в порядке того, как хорошо они масштабируются.
Опция 1: Определите Стиль без ключа на более низком уровне
Можно засунуть ресурс в WrapPanel
уровень так, чтобы это только влияло на средства управления в этом WrapPanel
:
<WrapPanel>
<WrapPanel.Resources>
<Style TargetType="TextBlock">
<Setter Property="Margin" Value="5,0,5,0"/>
</Style>
</WrapPanel.Resources>
<!-- TextBlocks here -->
</WrapPanel>
Заметьте отсутствие ключа. Это Style
будет относиться ко всем TextBlock
s в WrapPanel
.
Опция 2: Определите Стиль с ключом и снова без на более низком уровне
Если Вы определяете Style
в более высоком уровне с ключом можно затем определить другого Style
на более низком уровне без ключа и основе это Style
на высокоуровневом:
<Window>
<Window.Resources>
<Style TargetType="TextBlock" x:Key="textBlockStyle">
<Setter Property="Margin" Value="5,0,5,0"/>
</Style>
</Window.Resources>
<WrapPanel>
<WrapPanel.Resources>
<Style TargetType="TextBlock" BasedOn="{StaticResource textBlockStyle"/>
</WrapPanel.Resources>
<!-- TextBlocks here -->
</WrapPanel>
</Window>
Это приводит к a Style
быть автоматически относившимся TextBlock
s в WrapPanel
, но не снаружи. Кроме того, Вы не копируете детали Style
- они хранятся в более высоком уровне.
Опция 3: Поместите Стили в ResourceDictionary и выборочно объедините его
Наконец, можно поместить Ваш Style
s в отдельном ResourceDictionary
и выборочно слияние, что словарь в управление Resources
набор:
<!-- TextBlockStyles.xaml -->
<ResourceDictionary>
<Style TargetType="TextBlock">
<Setter Property="Margin" Value="5,0,5,0"/>
</Style>
</ResourceDictionary>
<!-- Window.xaml -->
<Window>
<WrapPanel>
<WrapPanel.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="TextBlockStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</WrapPanel.Resources>
</WrapPanel>
</Window>
<!-- Alternative Window.xaml if you have only one RD to merge in -->
<Window>
<WrapPanel>
<WrapPanel.Resources>
<ResourceDictionary Source="TextBlockStyles.xaml"/>
</WrapPanel.Resources>
</WrapPanel>
</Window>
Теперь Вы можете иметь как много наборов стиля, определенных в отдельных словарях как Вам угодно, и затем выборочно применить их к своему дереву элемента.
да, можно сделать, that.you почти имеют верное представление. Вы делаете это как это....
<WrapPanel>
< WrapPanel. Resources >
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Margin" Value="5,0,5,0"/>
</Style>
</WrapPanel.Resources/>
<TextBlock Server</TextBlock>
<TextBlock >IP</TextBlock>
<TextBlock >Port</TextBlock>
<TextBlock >Status</TextBlock>
</WrapPanel>
при помощи {x:type} синтаксиса Вам не нужен x:key, он установит стиль для всего textblocks в wrappanel., если Вы захотите различные стили, можно все еще использовать x:key, и explicity устанавливают стиль на textblock.