Kor*_*zak 0 python replace apply pandas
我在思考某些事情时遇到了麻烦,并且会喜欢一些指导.
我有一个数据框,其中包含具有应上载某些文件的事件日期的列,以及包含这些事件名称的列.因此事件可以是X,Y,Z,文件可以是1,2,3.
并非所有文件都需要在所有事件中上传,即如果是事件X,则需要上传文件1,2和3,但如果是事件Y,则只需要上传文件3.日期列中包含日期,或者为空白.
我想要做的是,对于不需要的事件的所有文件,用"不需要"替换空白.
初始:
File1 File2 File3
X Aug 1 Sept 1
X Aug 3 Aug 4 Sept 9
Y Sept 10
Z Aug 12
X Aug 13 Aug 15
Z Aug 1
Run Code Online (Sandbox Code Playgroud)
目标
File1 File2 File3
X Aug 1 Sept 1
X Aug 3 Aug 4 Sept 9
Y NN NN Sept 10
Z Aug 12 NN NN
X Aug 13 Aug 15
Z Aug 1 NN NN
Run Code Online (Sandbox Code Playgroud)
换句话说,对于因为不期望文件而应该为空的空白,将该值替换为"Not Needed",同时保留其他空白.
我试过用.replace(),. apply()和函数做这个,我没有任何成功.
下面的代码有点工作,但它不仅适用于匹配,但即使没有匹配.
Fill in descriptive text for scales not collected at certain visits (where upload dates would be blank)
df_combined['FAQ-Audio-upDate'] = np.where(df_combined['VisitName'] == "Screening", "FAQ Not Expected", "")
df_combined['FAQ-Form-upDate'] = np.where(df_combined['VisitName'] == "Screening", "FAQ Not Expected", "")
Run Code Online (Sandbox Code Playgroud)
如何根据整个数据框中另一列中的值更改一列中的值?我想要的基本上是这样的:
对于数据框中的每一行如果VisitName列中的值== X将ColumnA中的值更改为"Not Expected"

谢谢!!
所以,我可以很容易地回答你的基本问题,但是我认为你可能想要改变的一些风格的东西我想进入.我很确定这个问题已在其他主题中得到解决,但你有一些问题包含在1中所以我只想在这里解决它们
对于数据框中的每一行如果VisitName列中的值== X将ColumnA中的值更改为"Not Expected"
您希望使用索引切片来设置值.根据您想要的逻辑获取数据帧的布尔掩码,使用它来创建仅包含您要更新的行的新数据帧,获取此新数据帧的索引,并将此索引与原始数据帧一起使用以更改价值超过.
import pandas as pd
df = pd.DataFrame(data=None, index=["X", "Y", "Z"], columns=["VisitName",
"ColumnA", "ColumnB"])
not_expected_index = df[df.loc[:, "VisitName"] == "X"].index
df.loc[not_expected_index, "ColumnA"] = "Not Expected"
Run Code Online (Sandbox Code Playgroud)
这是pandas中基于另一列中其他值更改DataFrame中值的首选方法.
现在,关于您发布的原始DataFrame有一些我想提及的内容.首先,如果数据框单元格中已经有Null值,则可以使用pandas dataframe fillna方法填充这些值.
df.fillna("Not Expected")
Run Code Online (Sandbox Code Playgroud)
其次,为什么要在默认的Null值上使用字符串"NN"或"Not Needed"?对于pandas中的任何操作,我更喜欢坚持实际的空值,以便您可以在具有空值的数据帧上自由使用聚合函数,如sum或count.
其次,索引包含重复值:
df.index = ["X", "X", "Y", "Z", "X", "Z"]
Run Code Online (Sandbox Code Playgroud)
数据帧将允许重复的索引值,但它们可以以您需要注意的有趣方式运行.
例如:
print(df)
Run Code Online (Sandbox Code Playgroud)
回报
VisitName ColumnA ColumnB
X NaN NaN NaN
X NaN NaN NaN
Y NaN NaN NaN
Z NaN NaN NaN
X NaN NaN NaN
Z NaN NaN NaN
Run Code Online (Sandbox Code Playgroud)
在VisitName中为X设置值
df.loc["X", "VisitName"] = "test"
Run Code Online (Sandbox Code Playgroud)
回报
VisitName ColumnA ColumnB
X "test" NaN NaN
X "test" NaN NaN
Y NaN NaN NaN
Z NaN NaN NaN
X "test" NaN NaN
Z NaN NaN NaN
Run Code Online (Sandbox Code Playgroud)
如果我正在处理这个问题,我要么使用日期作为索引,在文件列中使用True或False值,具体取决于是否需要在该日期发送,
index File1 File2 File3
8/01/17 True False True
8/08/17 False True True
8/15/17 True True False
8/24/17 False True False
9/01/17 False False False
9/12/17 True False True
Run Code Online (Sandbox Code Playgroud)
或者我只使用整数索引,其中包含日期列和正在发送文件的列.
index date file
0 8/01/17 1
1 8/01/17 2
2 8/08/17 2
3 8/15/17 1
4 8/15/17 2
5 8/15/17 3
Run Code Online (Sandbox Code Playgroud)
我的意思是,如果你被锁定使用其他设置,那很好,但我认为这些将更容易使用数据帧设置,因为它们更容易支持groupby方法.
另外,请记住,如果您使用的是for循环,那么您可能也不会使用pandas.大熊猫的全部意义在于它使用C来加速索引操作.永远不要使用
for row in df.index:
df.loc[row, 'columna'] += 2.
Run Code Online (Sandbox Code Playgroud)
一直用
df.loc[:, 'columna'] += 2.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4837 次 |
| 最近记录: |