我在思考某些事情方面遇到了麻烦,并希望得到一些指导。
我有一个数据框,其中包含应该上传某些文件的事件日期的列,以及包含这些事件名称的列。因此事件可以是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
目标
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
所以换句话说,对于因为不期望文件而应该为空的空白,用'#34; 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", "")
如何根据整个数据框中另一列中的值更改一列中的值?我想要的基本上是这样的:
对于数据框中的每一行
如果VisitName列中的值== X.
将ColumnA中的值更改为" Not Expected"
谢谢!!
答案 0 :(得分:6)
所以,我可以很容易地回答你的基本问题,但我认为你可能想要改变的一些风格的东西,我想进入。我相当肯定这个问题已在其他主题中得到解决,但是您已经解决了一些问题,所以我只是在这里解决它们
对于数据框中的每一行如果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"
这是pandas中基于另一列中其他值更改DataFrame中值的首选方式。
现在,有关您发布的原始DataFrame的一些内容,我想提及。 首先,如果数据框单元格中已有Null值,则可以使用the pandas dataframe fillna method填充这些值。
df.fillna("Not Expected")
其次,为什么要使用字符串" NN"或者"不需要"超过默认的Null值?对于pandas中的任何操作,我更喜欢坚持使用实际的空值,这样就可以在具有空值的数据帧上自由使用sum或count等聚合函数。
其次,索引包含重复值:
df.index = ["X", "X", "Y", "Z", "X", "Z"]
Dataframes将允许重复的索引值,但它们可以以您需要注意的有趣方式运行。
例如:
print(df)
返回
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
在X的访问名称中设置值
df.loc["X", "VisitName"] = "test"
返回
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
如果我正在处理这个问题,我要么使用日期作为索引,在文件的列中使用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
或者我只使用整数索引,其中包含日期列和正在发送文件的列。
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
我的意思是,如果你被锁定使用其他设置,那很好,但我认为这些数据框设置更容易使用,因为他们支持{{3}更容易。
另外,请记住,如果您正在使用for循环,那么您可能不会使用pandas。大熊猫的全部意义在于它使用C来加速索引操作。永远不要使用
for row in df.index:
df.loc[row, 'columna'] += 2.
始终使用
df.loc[:, 'columna'] += 2.